FormsAuthentication没有成员资格的角色

时间:2013-06-05 06:53:21

标签: asp.net asp.net-mvc login asp.net-membership forms-authentication

我正在尝试使用FormsAuthentication,目前使用用户名和密码正常工作。我需要将用户角色添加到Forms身份验证故障单,我不使用ASP.NET成员身份。

if (rep.CheckUser(model.UserName, model.Password,out UserRole))//Check User
  {

  FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

 // Roles.AddUserToRole(model.UserName, UserRole);//This Requires Membership

  return Redirect(FormsAuthentication.DefaultUrl);

 }

1 个答案:

答案 0 :(得分:23)

FormsAuthenticationTicket构造函数(参数最多的构造函数)具有userData参数,该参数带有一个字符串。在这里,您可以添加您的角色,由管道(|)或哈希等字符分隔。您打算如何使用取决于您自己。您通常会注册AuthenticateRequest事件。所以,你可以创建一个票据:

private void CreateTicket()
{
    var ticket = new FormsAuthenticationTicket(
            version: 1,
            name: UserName,
            issueDate: DateTime.Now,
            expiration: DateTime.Now.AddSeconds(httpContext.Session.Timeout),
            isPersistent: false,
            userData: String.Join("|", arrayOfRoles));

    var encryptedTicket = FormsAuthentication.Encrypt(ticket);
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

    httpContext.Response.Cookies.Add(cookie);
}

之后在global.asax你会做这样的事情:

public override void Init()
{
    base.AuthenticateRequest += OnAuthenticateRequest;
}

private void OnAuthenticateRequest(object sender, EventArgs eventArgs)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        var decodedTicket = FormsAuthentication.Decrypt(cookie.Value);
        var roles = decodedTicket.UserData.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries);

        var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
        HttpContext.Current.User = principal;
    }
}

现在你在IPrincipal对象(HttpContext.Current.User)中有角色,当你用HttpContext.Current.User.IsUserInRole("RoleName")查询时,你会得到真或假。这样您就可以避免使用Roles提供程序。

更新:为了处理重新创建用户主体而调用的更好的事件是Application_AuthenticateRequest而不是BeginRequest。我已更新代码以反映这一点。