Страницы

Поиск по вопросам

среда, 17 июля 2019 г.

Razor Pages добавление и присвоение ролей

Я пытаюсь понять, как в Razor Pages 2.1. добавлять роли и присваивать их пользователям. Мне необходимо создать роль администратора и присвоить её предсозданному (seed) пользователю.
Я нашел, как это делается в MVC делается в MVC (вторая статья), но к сожалению, эти подход в Razor Pages у меня не сработали.
Подскажите, как можно создать и присвоить роли в Razor Pages 2.1.


Ответ

Получилось сделать следующим образом. Сперва, я воспользовался кодом, предложенным пользователем Paul Madson в https://stackoverflow.com/questions/42471866/how-to-create-roles-in-asp-net-core-and-assign-them-to-users. Нижеследующий метод я вставил в файл Startup.cs. Он создает роль администратора и присваивает её предсоздаваемому пользователю.
private void CreateRoles(IServiceProvider serviceProvider) { var roleManager = serviceProvider.GetRequiredService>(); var userManager = serviceProvider.GetRequiredService>(); Task roleResult; string email = "someone@somewhere.com";
//Check that there is an Administrator role and create if not Task hasAdminRole = roleManager.RoleExistsAsync("Administrator"); hasAdminRole.Wait();
if (!hasAdminRole.Result) { roleResult = roleManager.CreateAsync(new IdentityRole("Administrator")); roleResult.Wait(); }
//Check if the admin user exists and create it if not //Add to the Administrator role
Task testUser = userManager.FindByEmailAsync(email); testUser.Wait();
if (testUser.Result == null) { ApplicationUser administrator = new ApplicationUser { Email = email, UserName = email, Name = email };
Task newUser = userManager.CreateAsync(administrator, "_AStrongP@ssword!123"); newUser.Wait();
if (newUser.Result.Succeeded) { Task newUserRole = userManager.AddToRoleAsync(administrator, "Administrator"); newUserRole.Wait(); } }
}
Затем, в этом же файле в методе Configure я добавил аргумент IServiceProvider serviceProvider, то есть по части сигнатуры он стал выглядеть наподобие Configure(..., IServiceProvider serviceProvider). В нем же, в самом конце, я добавил строку CreateRoles(serviceProvider). Чтобы этот код работал, предварительно следует создать, например, в папке Data. следующий класс:
using Microsoft.AspNetCore.Identity; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;
namespace Sobopedia.Data { public class ApplicationUser: IdentityUser { public string Name { get; set; } } }
Наконец, в методе ConfigureServices следует заменить
services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders();
на
services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders();
В результате, после запуска программы в таблице AspNetRoles у вас появится новая роль, а в таблице AspNetUsers новый пользователь, обладающий этой ролью.
К сожалению, если вы создавали шаблон с изначальной авторизацией, то при добавлении
services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders();
перестанут работать страницы Login и Registration. Чтобы исправить это, необходимо:
Scaffold Identity следуя (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.1&tabs=visual-studio). Если вы используете шаблон с предсозданной авторизацией, то смотрите раздел Scaffold identity into a Razor project with authorization. После создания шаблона следует заменить во всем решении все IdentityUser на ApplicationUser. За исключением класса ApplicationUser, который по прежнему должен наследовать IdentityUser. Убрать из Areas/identity/Pages/Account/Register.cs (то есть модели) все, что связано с EmailSernder, если у вас нет его имплементации.
Чтобы проверить корректность работы данного решения можно сделать следующее. В конце метода ConfigureServices в классе Startup.cs добавляем следующее:
services.AddAuthorization(options => { options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator")); });
services.AddMvc().AddRazorPagesOptions(options => { options.Conventions.AuthorizePage("/Contact","RequireAdministratorRole"); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Также, для надежности или если этот код не сработает, в модель страницы Contact можно добавить [Authorize(Roles = "Administrator")], чтобы она выглядели следующим образом:
namespace Sobopedia.Pages { [Authorize(Roles = "Administrator")] public class ContactModel : PageModel { public string Message { get; set; }
public void OnGet() { Message = "Your contact page."; } } }
Теперь, попасть на страницу Contact вы сможете только при условии, что авторизуетесь с логином someone@somewhere.com и паролем _AStrongP@ssword!123. Метод может не сработать, если при создании администратора будет использован пароль, содержащий запрещенные и не содержащий необходимые символы.

Комментариев нет:

Отправить комментарий