添加到HttpContext.current.user但isInRole(rolename)的角色不起作用

时间:2018-10-19 10:46:34

标签: c# forms-authentication

这是我有关身份验证和授权的代码

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”)] 授权不起作用时。

我尝试了这些解决方案,但是没有用:

  1. 我使用了在StackOverflow中说明的 [CustomAthorize(Roles =“ Admin”)]
  2. 我使用了 Thread.CurrentPrincipal = userPrincipal

请帮助我解决这个问题,我在论坛上搜索了一整天,但没有找到任何内容。

注意:如您所见,我在Global.asax中添加了Debug.WriteLine()来向我显示userPrincipal角色状态,但始终返回false。

通知:如果可以,请向我展示另一种使用基于OWIN的授权和身份验证的方法

1 个答案:

答案 0 :(得分:0)

一无所获... 我花了几个小时,才意识到问题出在将角色名称保存到HttpContext中,这是在用“”保存角色名称,而必须在不使用“”的情况下保存