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

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

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


person daniel    schedule 23.10.2013    source источник
comment
Существуют поставщики простых ролей, которые позволяют вам ограничивать доступ к частям вашего приложения по ролям. Вы можете легко создавать роли, такие как «Администратор», и добавлять пользователей в роли.   -  person Ramesh Rajendran    schedule 23.10.2013


Ответы (4)


Начиная с .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"));

Утверждения могут упростить и повысить производительность процессов проверки подлинности и авторизации. Вы можете использовать роли, хранящиеся в виде утверждений, чтобы исключить внутренние запросы при каждой авторизации.

Используя Claims, вам больше не понадобится RoleStore (по крайней мере, для эквивалентных целей авторизации...)

person MyOwnWay    schedule 03.02.2014

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

И затем в вашем контроллере:

private ApplicationRoleManager _roleManager;

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

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

person Iman    schedule 18.11.2016
comment
Отлично, спасибо! - person John; 25.03.2021

Удостоверение 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

person user3303254    schedule 06.03.2014
comment
Идентификация ASP.NET (по крайней мере, версия 2.0, насколько я могу судить) действительно имеет RoleManager; он расположен в пространстве имен Microsoft.AspNet.Identity, и вы обнаружите, что он используется в нескольких примерах/начальных приложениях, которые, как я полагаю. - person Funka; 02.07.2014

person    schedule
comment
Мы также можем поместить это в наш файл Startup.Auth.cs следующим образом. RoleManagerFactory = () => new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());, а затем скопируйте использование UserManagerFactory. - person Shaun Luttin; 04.02.2014
comment
вместо MyDbContext() используйте ApplicationDbContext() или найдите свой унаследованный класс IdentityDbContext - person Iman; 18.11.2016