Добавить роль в ASP.NET Identity
Как я могу добавить роль в новой системе удостоверений ASP.NET (1.0)? E сть UserStore
класс но нет RoleStore
учебный класс.
Я не могу найти документацию по этому вопросу.
4 ответа
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")
{
}
}
Также создайте приложение Role Manager тоже класс
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, и я не уверен, если это необходимо, или я делаю это чисто и правильно, но эти шаги работали для меня
Идентификация ASP.NET - это заявления о ролях. Это действительно смутило меня, потому что в предыдущей системе вы настраивали поставщиков членства и ролей в web.config.
Для меня проблема в том, что у меня есть такой код:
HttpContext.Current.User.IsInRole("some role")
К счастью, эта логика все еще работает. Вы можете увидеть логику в CreateAsync
функция в ClaimsIdentityFactory.cs, которая находится в Microsoft.AspNet.Identity.Core
, Одним из аргументов является UserManager
, Он спрашивает, если это SupportsUserRole
и если да, то это вызывает GetRolesAsync
и добавляет каждую роль в качестве требования к ClaimIdentity
, Нет необходимости делать это самостоятельно.
IsInRole
использует претензии, как описано здесь: