c# - 角色添加到 HttpContext.current.user 但 isInRole(rolename) 不起作用
问题描述
这是我关于身份验证和授权的代码
public class SessionContext
{
public void setAuthenticationToken(UserAccount userAccount,bool isPersistant,string name)
{
string data = new JavaScriptSerializer().Serialize(userAccount.Roles);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,name,DateTime.Now,DateTime.Now.AddYears(1),isPersistant,data);
var encryptedCookieData = FormsAuthentication.Encrypt(ticket);
HttpCookie httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookieData) { HttpOnly=true,Expires=ticket.Expiration };
HttpContext.Current.Response.Cookies.Add(httpCookie);
}
}
我的 Global.asax 有这个方法:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(new Char[] { ',' });
GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
HttpContext.Current.User = userPrincipal;
Debug.WriteLine(roles.FirstOrDefault() +" "+ userPrincipal.IsInRole("Admin"));
}
}
但是当我使用[Authorize(Roles="Admin")]授权时不起作用。
我尝试了这些解决方案,但没有奏效:
- 我使用了 StackOverflow 中解释的[CustomAthorize(Roles="Admin")]
- 我用Thread.CurrentPrincipal=userPrincipal
注意:如您所见,我在 Global.asax 中添加了 Debug.WriteLine() 以显示 userPrincipal 角色状态,但始终返回 false。
注意:如果可以,请告诉我另一种使用不基于 OWIN 的授权和身份验证的方法
解决方案
我意识到问题是在将角色名称保存到 HttpContext 时,它用“”保存了角色名称,而它必须在没有“”的情况下保存
推荐阅读
- spring - 使用 PCF 服务代理配置自定义命名的 SQS 队列
- electron - Wine:使用电子构建的 exe 文件会产生错误“错误的 EXE 格式”
- spring - 在 docker 容器中运行可运行 jar 时,Grails Spring Security Active Directory 登录失败
- java - 第二次调用时底部工作表片段会导致错误
- python - 如何使用pyplot的多个图形对象?
- html - 如何从最后一个孩子中删除 flex 属性?
- javascript - 如何在异步函数中修复 [object Promise]?
- xslt - 在 XSLT 中应用模板但不起作用
- python - 缩放绘图(matplotlib)
- c - 允许对易失性对象进行优化