从{。1}}中的.net版本3.5升级到4.5个角色后停止工作。用户已通过身份验证,但框架似乎没有获取角色信息,并且拒绝用户访问管理员内容。
以下是登录用户的代码:
FormsAuthentication
在Global.asax中,此代码使用角色信息更新当前用户。当我调试时,我可以看到角色是admin:
int timeout = int.Parse(ConfigurationManager.AppSettings["loginTimeoutMinutes"]);
HttpContext.Current.Session.Timeout = timeout;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.AddMinutes(timeout),
false,
roles,
FormsAuthentication.FormsCookiePath);
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
HttpContext.Current.Response.Cookies.Add(cookie);
这是主web.config的身份验证位:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated &&
HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id = (FormsIdentity) HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}
登录后,用户将被重定向到包含以下 <roleManager enabled="true"></roleManager>
<authentication mode="Forms">
<forms name="theForm" loginUrl="/login.aspx"/>
</authentication>
的文件夹中的文件:
web.config
当我调试一切看起来很好,但用户被拒绝访问管理页面。
我错过了什么吗?感谢帮助。 (我知道之前已经问过这个问题,但是我已经在stackoverflow上阅读了大约50个问题/答案并尝试了所有的建议而没有找到答案)
(另一个奇怪的是,在升级.net版本之后我不得不添加
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<allow roles="admin" />
<deny users="*"/>
</authorization>
</system.web>
</configuration>
到web.config以获取重定向以转到正确的登录页面。)
答案 0 :(得分:0)
Stackoverflow的好人!
我使用了错误的EventHandler
。要使用的是PostAuthenticateRequest
。
我真诚地向读了这个问题的十八个人道歉,我浪费了他们的时间。