首页 文章

MVC 3身份验证/授权:缺少角色

提问于
浏览
1

我们使用MVC 3.默认用户管理不适用于我们,因为我们的帐户信息存储在我们自己的数据存储中,访问通过我们自己的存储库类进行 .

我正在尝试将主要添加角色分配给HttpContext.User并发出授权cookie .

基于代码剪切我发现我尝试过这样的事情:

if (UserIsOk(name, password))
{
    HttpContext.User =
        new GenericPrincipal(
            new GenericIdentity(name, "Forms"),
            new string[] { "Admin" }
        );
    FormsAuthentication.SetAuthCookie(name, false);

    return Redirect(returnUrl);
}

完成下一个请求后,将对用户进行身份验证,但他不处于“管理员”角色 . 我错过了什么?

2 回答

  • 0

    我认为你应该实施 FormsAuthenticationTicket . 更多信息:http://msdn.microsoft.com/en-us/library/aa289844(v=vs.71).aspx

    在Mvc中,它非常相似 .

    我有一个名为UserSession的类,它被注入到LoginController中,我在LogOn操作中使用:

    [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Index(LoginInput loginInput, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            return (ActionResult)_userSession.LogIn(userToLog, loginInput.RememberMe, CheckForLocalUrl(returnUrl), "~/Home");
        }
    }
    

    这是我的UserSession LogIn实现(注意我将“Admin”角色硬编码为示例,但您可以将其作为参数传递):

    public object LogIn(User user, bool isPersistent, string returnUrl, string redirectDefault)
        {
            var authTicket = new FormsAuthenticationTicket(1, user.Username, DateTime.Now, DateTime.Now.AddYears(1), isPersistent, "Admin", FormsAuthentication.FormsCookiePath);
            string hash = FormsAuthentication.Encrypt(authTicket);
    
            var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
    
            if (authTicket.IsPersistent) authCookie.Expires = authTicket.Expiration;
    
            HttpContext.Current.Response.Cookies.Add(authCookie);
    
            if (!String.IsNullOrEmpty(returnUrl))
                return new RedirectResult(HttpContext.Current.Server.UrlDecode(returnUrl));
    
            return new RedirectResult(redirectDefault);
        }
    

    然后在基本控制器中我重写OnAuthorization方法来获取cookie:

    if (filterContext.HttpContext.Current.User != null)
    {
       if (filterContext.HttpContext.Current.User.Identity.IsAuthenticated)
       {
          if( filterContext.HttpContext.Current.User.Identity is FormsIdentity ) 
          {
             FormsIdentity id = filterContext.HttpContext.Current.User.Identity as FormsIdentity;
             FormsAuthenticationTicket ticket = id.Ticket;
             string roles = ticket.UserData;
    
             filterContext.HttpContext.Current.User = new GenericPrincipal(id, roles);
          }
       }
    }
    

    我希望这有帮助 . 让我知道 .

  • 0

    您确定,这些角色已启用,并且有这样的角色吗?

    如果没有,请执行以下操作:在Visual Studio中:项目 - > ASP.NET配置

    然后选择安全性,启用角色 . 创建角色“管理员” .

    然后尝试你的方法

相关问题