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

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

4

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

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

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

于 2011-12-06T17:13:01.803 回答
0

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

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

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

然后试试你的方法

于 2011-12-07T10:24:41.957 回答