【问题标题】:MVC 3 Authentication / Authorization: Roles missingMVC 3 身份验证/授权:缺少角色
【发布时间】:2012-01-14 05:46:59
【问题描述】:

我们使用 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);
}

当下一个请求完成时,用户已通过身份验证,但他不是“管理员”角色。 我错过了什么?

【问题讨论】:

    标签: asp.net-mvc authentication user-roles


    【解决方案1】:

    你确定,那个角色是启用的,并且有这样的角色吗?

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

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

    那就试试你的方法

    【讨论】:

      【解决方案2】:

      我认为你应该实现 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 实现(请注意,我将“管理员”角色硬编码为示例,但您可以将其作为参数传递):

      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);
            }
         }
      }
      

      我希望这会有所帮助。告诉我。

      【讨论】:

      • 谢谢。这一切都在那里。只是找到正确的部分是困难的;-)
      • 我已经将您的回复标记为答案。但是那里的样本和它在 MVC3 中的工作方式似乎有所不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2010-11-25
      • 2015-05-05
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多