ASP.NET MVC自定义的IPrincipal注射(ASP.NET MVC custom IPr

2019-08-17 20:10发布

我使用ASP.NET MVC 1.0上的应用程序的工作,我试图给HttpContext.Current.User对象注入一个自定义的IPrincipal对象。

与传统的WebForms应用程序,我已经使用了Application_AuthenticateRequest事件要做到这一点,如下所示。

protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    // Get Forms Identity From Current User
                    FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                    // Get Forms Ticket From Identity object
                    FormsAuthenticationTicket ticket = id.Ticket;
                    // Create a new Generic Principal Instance and assign to Current User
                    SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name));

                    HttpContext.Current.User = siteUser;
                }
            }
        }

    }

因此,使用此我能够明确地铸造用户对象键入SiteUser访问我的自定义的IPrincipal。 我实际上是由具有所有页面都从这样做的封面,我下继承的自定义类这样做。

总之,我的问题是,与ASP.NET MVC的Application_AuthenticateRequest似乎火,只要任何请求时(因此对于JS文件,图像等),这会导致应用程序死掉。

任何帮助或建议,我怎么能去注射我自定义的IPrincipal到ASP.NET MVC 1.0中HttpContext.Current.User对象将不胜感激。 我没有看到,因此下面的帖子,但它似乎并没有满足我想要实现: ASP.NET MVC -设置自定义的IIdentity或IPrincipal的

TIA。

Answer 1:

我的问题是,与ASP.NET MVC的Application_AuthenticateRequest似乎火,只要任何请求时(因此对于JS文件,图像等),这会导致应用程序死掉。

这不是一个独特的MVC问题 - 如果你在地方综合管线跑了您的应用程序IIS7然后你会看到同样的事情。

如果与查找问题是可伸缩性那么我想实际的问题是内

FormsAuthenticationTicket ticket = id.Ticket;
SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name));

我猜你SiteUser类做某种数据库查找。 如果你研究如何窗体身份验证工作票包含所有必要产生FormsIdentity的信息(这不适合角色保持为真,除非你明确地使角色缓存到一个cookie)。 所以,你应该看看同样的做法。 当您第一次构建您siteUser对象缓存一个签名cookie中,然后使用cookie在后续的请求补充水分,你的SiteUser性能。

如果你这样做,那么你可以走一步,你的SiteUser更换主题的原则,或具有相同的信息作为你的SiteUser类将至少有一个自定义的IPrincipal / IUSER组合。

所以里面AuthenticateRequest你不得不像一些流

SiteUserSecurityToken sessionToken = null;
if (TryReadSiteUserSecurityToken(ref sessionToken) && sessionToken != null)
{
    // Call functions to attach my principal.
}
else
{
    if (HttpContext.Current.User != null && 
        HttpContext.Current.User.Identity.IsAuthenticated && 
        HttpContext.Current.User.Identity is FormsIdentity)
    {
        // Get my SiteUser object

        // Create SiteUserSecurityToken

        // Call functions to attach my principal.
    }
}

而附加的主要功能将包含类似

HttpContext.Current.User = sessionSecurityToken.ClaimsPrincipal;
Thread.CurrentPrincipal = sessionSecurityToken.ClaimsPrincipal;
this.ContextSessionSecurityToken = sessionSecurityToken;

您将获得使用机器密钥,如果它配置的话要确保其写入安全令牌一个cookie的功能添加在最低限度,校验/ MAC值,并且,如果你喜欢,支持加密。 读功能应该验证这些值。



Answer 2:

这听起来像一个工作自定义授权筛选 。



文章来源: ASP.NET MVC custom IPrincipal injection