42

如何在新的 ASP.NET 身份系统 (1.0) 中添加角色?有UserStore课,但没有RoleStore课。

我找不到有关此问题的任何文档。

4

4 回答 4

45
RoleManager = new RoleManager<IdentityRole>(
                  new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
于 2013-10-23T12:24:09.837 回答
40

从 .NET Framework 4.5 开始,Windows Identity Foundation (WIF) 已完全集成到 .NET Framework。

我建议检查通过声明(将角色表达为声明)实施授权的可能性,在我看来是首选。

调用 IsInRole() 方法时,会检查当前用户是否具有该角色。在声明感知应用程序中,角色由令牌中应该可用的角色声明类型表示。

角色声明类型使用以下 URI 表示:“ http://schemas.microsoft.com/ws/2008/06/identity/claims/role

所以从UserManager你可以做这样的事情(没有 RoleManager):

var um = new UserManager();
um.AddClaimAsync(1, new Claim(ClaimTypes.Role, "administrator"));

声明可以简化和提高身份验证和授权过程的性能。您可以使用存储为声明的角色来消除每次授权时的后端查询。

使用声明,您将不再需要 RoleStore(至少出于等效授权目的......)

于 2014-02-03T01:10:05.923 回答
7

我在一个示例 asp.net 网页page_load中使用了以下片段来开始掌握 ASP Identity 的工作方式

   UserManager userManager = new UserManager();
    var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    var applicationRoleAdministrator = new IdentityRole("superadmin");
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
    {
        roleManager.Create(applicationRoleAdministrator);
    }
     ApplicationUser applicationUserAdministrator = userManager.FindByName(User.Identity.Name);

    if (!userManager.GetRoles(applicationUserAdministrator.Id).Contains("superadmin"))
    {
        Response.Redirect("~/account/login.aspx?ReturnUrl=" + Request.Url.AbsolutePath);
    }

当然,下面的 ApplicationDbContext 是使用 ASP.NET 4.5+ 模板自动生成的,如下所示

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }
    }

还要创建应用程序角色管理器类

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        //return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
        return new ApplicationRoleManager(new RoleStore<IdentityRole>(new ApplicationDbContext()));
    }
}

还在您的 startup.Auth.cs => ConfigureAuth(IAppBuilder app) 方法中添加以下行

  app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

然后在你的控制器中:

private ApplicationRoleManager _roleManager;

public ApplicationRoleManager RoleManager
{
    get
    {
        return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
    }
    private set
    {
        _roleManager = value;
    }
}

我是这个身份资料的新手,我不确定是否有必要,或者我做得很干净和正确,但这些步骤对我有用

于 2016-11-18T14:32:57.753 回答
2

ASP.NET 标识是关于角色的声明。这真的让我很困惑,因为在以前的系统中,您在 web.config 中配置了成员资格和角色提供者。

我的问题是我有这样的代码:

HttpContext.Current.User.IsInRole("some role")

幸运的是,这个逻辑仍然有效。您可以CreateAsync在 ClaimsIdentityFactory.cs 中看到函数中的逻辑Microsoft.AspNet.Identity.Core。论据之一是UserManager。它询问它是否SupportsUserRole,如果是,那么它调用GetRolesAsync并将每个角色作为声明添加到ClaimIdentity. 无需自己执行此操作。

IsInRole使用此处描述的声明:

http://msdn.microsoft.com/en-us/library/hh545448.aspx

于 2014-03-06T15:40:00.907 回答