9

我有一个受[Authorize]属性保护的控制器。

这很好用(如果我没有登录,我会被送回登录),但我希望为这个属性添加一些角色,我已经读过它可以做类似的事情[Authorize(Roles = "Customer"]但是当我这样做时,我会立即被发送回到我的应用程序的登录页面?

Roles覆盖是否不适用于新的 ASP.NET 标识?在我的用户创建中,我通过以下代码将用户添加到:

var user = new ApplicationUser {UserName = model.Username};
var result = UserManager.Create(user, model.Password);
if (result.Succeeded)
{
    UserManager.AddToRole(user.Id, "Customer");
    SignIn(user, false);

    return RedirectToAction("Done");
}

并且根据数据库,用户处于此角色。为什么这不起作用?我是否缺少配置或某种形式?

4

5 回答 5

9

我要回答我自己的问题。

这不起作用的原因(数小时的挖掘)是因为我的上下文有以下内容:

Configuration.ProxyCreationEnabled = false;

这使得延迟加载被禁用,因此在加载用户时不包括角色!

所以修复是启用此功能或删除该行。

更新:2015-05-01

这是一个错误,已在 2.0.0-alpha1 版本中修复。因此,以后不再需要此解决方法,并且无论此设置如何,都会加载角色。

Identity Owin 是否需要延迟加载?

于 2014-01-10T16:35:28.837 回答
0

像这样创建一个角色:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));

然后,像这样添加一个用户:

var currentUser = UserManager.FindByName(user.UserName); 
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");

请让我知道这是否适合您。

于 2014-01-08T17:48:24.247 回答
0

在我的情况下,它适用于 AspNet Identity。你确定你:

  • 没有自定义授权过滤器或做对了吗?
  • 尚未在 web.config 中重新配置身份验证/授权?
  • 在 AspNet 身份表中有正确的条目:AspNetUsers、AspNetRoles、AspNetUserRoles(角色存在并且用户拥有它)?
于 2014-01-08T20:14:07.010 回答
0

签出这个答案:ASP.NET Identity check user roles is not working

在您的情况下,在检查案例时,比较 IdentityRole 记录和授权属性的情况。不要与UserManager.AddToRole(user.Id, "Customer");

于 2014-01-09T06:11:23.767 回答
0

我写了一个样本来测试它,它工作得很好。所以我认为有 2 点
1.you cookie 没有保存到浏览器
2.you cookie 没有角色信息

检查你的cookie,是否有一个名为“.AspNet.ApplicationCookie”(默认名称)的cookie
如果没有那么检查你的浏览器允许写入cookie,或者你写cookie的代码
如果存在,你可以创建一个类扩展

ISecureDataFormat<AuthenticationTicket>  

和配置

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            TicketDataFormat=new T()

        });

new T() 是
这个类中你需要做的类

public string Protect(AuthenticationTicket data)

public AuthenticationTicket Unprotect(string protectedText)

这是关于序列化的一些事情,
您可以设置一个断点并检查数据,
在 data.Identity.Claims (一个 IEnumerable<Claims>)中应该有一个带有您的角色信息的声明

于 2014-01-09T09:25:53.680 回答