GenericPrincipal IsInRole为HttpContext.User返回false

时间:2014-05-21 07:26:07

标签: asp.net asp.net-mvc asp.net-mvc-4

我有一个凭证方法来通过GenericPrincipal设置用户凭据。我正在使用asp.net MVC

    public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie)
    {
        FormsAuthentication.SetAuthCookie(username, createPersistenceCookie);

        IIdentity identity = new GenericIdentity(username);
        IPrincipal principal = new GenericPrincipal(identity,new []{"standart"});

        context.User = principal;
    }

我想在控制器操作中检查 User.IsInRole(“standart”),但它返回false。

  
      
  • context.User.IsInRole(“standart”)//返回false
  •   

我想在我的应用程序中使用 context.User ,但它总是返回false。

1 个答案:

答案 0 :(得分:1)

我认为您以前使用过asp.net会员资格api。现在您想在应用程序中创建自定义主体。

当您向服务器发送请求时,服务器使用新的干净的HttpContext。所以你丢失了旧的信息。如果您想使用旧的会话信息是应用程序,您可以在服务器或客户端保存您的数据。你可以这两种方式做到这一点。

  • 客户端Cookie
  • 服务器会话

我建议你使用客户端cookie。因为数据存储在客户端,所以可以节省服务器资源。

   public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie)
    {
        var formsAuthenticationTicket = new FormsAuthenticationTicket(
            1,
            username,
            DateTime.Now,
            DateTime.Now.AddMilliseconds(FormsAuthentication.Timeout.TotalMilliseconds),
            createPersistenceCookie,
            roles
        );

        var encryptedTicket = FormsAuthentication.Encrypt(formsAuthenticationTicket);
        var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

        HttpContext.Current.Response.AppendCookie(authCookie);
    }

我向客户端发送了加密cookie。我应该检查这个cookie所有传入服务器应用程序的请求。

现在在 Global.asax 文件中:

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

        if (authCookie == null) return;

        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);

        IIdentity identity = new GenericIdentity(ticket.Name);
        IPrincipal principal = new GenericPrincipal(identity, ticket.UserData.Split('|'));

        HttpContext.Current.User = principal;
    }

我希望解决你的问题。