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

这非常有效(如果我没有登录,我会被发送回登录),但我希望向此属性添加一些角色,我已经读到可以执行类似的操作 [Authorize(Roles = "Customer"] 但是当我这样做时,我会立即返回到我的应用程序的登录页面吗?

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

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

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

有帮助吗?

解决方案

我要回答我自己的问题。

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

Configuration.ProxyCreationEnabled = false;

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

因此解决方法是启用此功能或删除该行。

更新:2015-05-01

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

Identity Owin 是否需要 LazyLoading?

其他提示

像这样创建一个角色:

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

请告诉我这是否适合您。

在我的例子中,它与 AspNet Identity 配合得很好。你确定你:

  • 还没有定制授权过滤器或者做得正确吗?
  • 尚未在 web.config 中重新配置身份验证/授权?
  • 在 AspNet Identity 表中有正确的条目:AspNetUsers、AspNetRoles、AspNetUserRoles(角色存在且用户拥有)?

看看这个答案: ASP.NET 身份检查用户角色不起作用

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

我写了一个示例来测试它,效果很好。所以我认为有两点
1.你的cookie没有保存到浏览器
2.你的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< Claim>) 中应该有一个包含您的角色信息的声明

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top