Добавить роль в ASP.NET Identity

Как добавить роль в новую систему ASP.NET Identity (1.0)? Существует класс UserStore, но не класс RoleStore.

Я не могу найти документацию по этой проблеме.

Ответ 1

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

Ответ 2

Начиная с .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 (по крайней мере, для эквивалентных целей авторизации...)

Ответ 3

Я использовал ниже фрагменты на одной веб-странице 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.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

Я новичок в этом Identity Stuff, и я не уверен, что это необходимо, или я делаю это чистым и правильным, но эти шаги работали для меня

Ответ 4

Идентификация 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