首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 3身份验证/授权:缺少角色

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

Stack Overflow用户
提问于 2011-12-07 00:10:54
回答 2查看 775关注 0票数 1

我们使用MVC3。默认的用户管理对我们来说是不可用的,因为我们的帐户信息存储在我们自己的数据存储中,访问是通过我们自己的存储库类进行的。

我正在尝试分配一个主体,向HttpContext.User添加角色,并分发一个授权cookie。

根据截取的代码,我发现我尝试了以下代码:

代码语言:javascript
复制
if (UserIsOk(name, password))
{
    HttpContext.User =
        new GenericPrincipal(
            new GenericIdentity(name, "Forms"),
            new string[] { "Admin" }
        );
    FormsAuthentication.SetAuthCookie(name, false);

    return Redirect(returnUrl);
}

当下一个请求完成时,用户通过了身份验证,但他不是"Admin“角色。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-07 01:13:02

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

在Mvc中,这一点非常相似。

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

代码语言:javascript
复制
    [HttpPost, ValidateAntiForgeryToken]
public ActionResult Index(LoginInput loginInput, string returnUrl)
{
    if (ModelState.IsValid)
    {
        return (ActionResult)_userSession.LogIn(userToLog, loginInput.RememberMe, CheckForLocalUrl(returnUrl), "~/Home");
    }
}

下面是我的UserSession LogIn实现(请注意,我为示例硬编码了“管理员”角色,但您可以将其作为参数传递):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-12-07 18:24:42

您确定该角色已启用,是否存在该角色?

如果没有,请执行下列操作:在Visual Studio中: Project -> ASP.NET Configuration

然后选择Security、enable roles。创建角色Admin。

然后尝试你的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8403061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档