从Thread.CurrentPrincipal设置HttpContext.Current.User

时间:2010-05-17 14:58:35

标签: c# asp.net security

我的应用程序中有一个安全管理器,适用于Windows和Web,过程很简单,只需要用户和pwd并对数据库进行身份验证,然后使用自定义主体设置Thread.CurrentPrincipal。对于Windows应用程序,这可以正常工作,但我遇到了Web应用程序的问题。

在身份验证过程之后,当我尝试将Current.User设置为Thread.CurrentPrincipal中的自定义主体时,最后一个包含GenericPrincipal。难道我做错了什么?这是我的代码:

的Login.aspx

protected void btnAuthenticate_Click(object sender, EventArgs e)
{
    SecurityManager.Authenticate("user","pwd"); // This is where I set the custom principal in Thread.CurrentPrincipal
    FormsAuthenticationTicket authenticationTicket = new FormsAuthenticationTicket(1,
                        "user",
                        DateTime.Now,
                        DateTime.Now.AddMinutes(30),
                        false,
                        "");

    string ticket = FormsAuthentication.Encrypt(authenticationTicket);
    HttpCookie authenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket);
    Response.Cookies.Add(authenticationCookie);    
    Response.Redirect(FormsAuthentication.GetRedirectUrl("user", false));
}

Global.asax(这是出现问题的地方)

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null)
        return;

    if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity is FormsIdentity)
    {                
        HttpContext.Current.User = System.Threading.Thread.CurrentPrincipal; //Here the value is GenericPrincipal
    }

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

首先:您需要在每个请求上设置主体。

表单身份验证使用它自己在每个请求上分配主体。这就是你看到GenericPrincipal

的原因

当标准身份验证机制完成时,我通常会在OnPostAuthenticate中重新分配我的自定义原语。

答案 1 :(得分:1)

JFYI,你可以替换

if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity is FormsIdentity) { }

FormsIdentity formsIdentity = HttpContext.Current.User as FormsIdentity;
if (formsIdentity != null & formsIdentity.IsAuthenticated) { }

减少if子句的长度

答案 2 :(得分:0)

Intellisense告诉我,HttpContext.Current.userSystem.Threading.Thread.CurrentPrincipal都属于System.Security.Principal.IPrincipal类型。

如果我理解正确,这意味着语句HttpContext.Current.User = System.Threading.Thread.CurrentPrincipal;将为httpcontext用户分配线程主体的值而不进行任何转换或转换。

我没有看到您在代码中确切地设置了System.Threading.Thread.CurrentPrincipal的值,但我建议您仔细检查如何设置主体。我建议您在此代码上放置断点并在调试器中运行它。逐行查看发生的情况。

答案 3 :(得分:0)

抱歉VB(可怕的语言),但这应该回答你的问题......

http://www.asp.net/security/videos/use-custom-principal-objects

然后将该行代码更改为......

HttpContext.Current.User = (CustomPrinciple)System.Threading.Thread.CurrentPrincipal;

那应该给你你需要的东西。 适合我的工作:)

答案 4 :(得分:-2)

使用基于表单的身份验证(FBA)时,您将在ASP.NET中获得GenericPrincipal。这是正常的,你没有做错任何事。

你期待什么?如果您期望使用WindowsPrincipal,则可以在ASP.NET应用程序中使用Windows集成身份验证。