Как добавить роль в новую систему ASP.NET Identity (1.0)?
Существует класс UserStore
, но не класс RoleStore
.
Я не могу найти документацию по этой проблеме.
Как добавить роль в новую систему ASP.NET Identity (1.0)?
Существует класс UserStore
, но не класс RoleStore
.
Я не могу найти документацию по этой проблеме.
RoleManager = new RoleManager<IdentityRole>(
new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
Начиная с .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 (по крайней мере, для эквивалентных целей авторизации...)
Я использовал ниже фрагменты на одной веб-странице 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, и я не уверен, что это необходимо, или я делаю это чистым и правильным, но эти шаги работали для меня
Идентификация ASP.NET - это утверждения, относящиеся к ролям. Это действительно смутило меня, потому что в предыдущей системе вы настроили поставщиков членства и роли в web.config.
Проблема для меня в том, что у меня такой код:
HttpContext.Current.User.IsInRole("some role")
К счастью, эта логика все еще работает. Вы можете увидеть логику в функции CreateAsync
в ClaimsIdentityFactory.cs, которая находится в Microsoft.AspNet.Identity.Core
. Один из аргументов - UserManager
. Он запрашивает его, если он SupportsUserRole
, и если это так, он вызывает GetRolesAsync
и добавляет каждую роль в качестве претензии к ClaimIdentity
. Нет необходимости делать это самостоятельно.
IsInRole
использует утверждения, как описано здесь: