我的应用程序中有一个安全管理器,适用于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
}
提前感谢您的帮助。
答案 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.user
和System.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集成身份验证。