Я пытаюсь понять, как в 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
//Check that there is an Administrator role and create if not
Task
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
if (testUser.Result == null)
{
ApplicationUser administrator = new ApplicationUser
{
Email = email,
UserName = email,
Name = email
};
Task
if (newUser.Result.Succeeded)
{
Task
}
Затем, в этом же файле в методе 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
на
services.AddIdentity
В результате, после запуска программы в таблице AspNetRoles у вас появится новая роль, а в таблице AspNetUsers новый пользователь, обладающий этой ролью.
К сожалению, если вы создавали шаблон с изначальной авторизацией, то при добавлении
services.AddIdentity
перестанут работать страницы 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. Метод может не сработать, если при создании администратора будет использован пароль, содержащий запрещенные и не содержащий необходимые символы.
Комментариев нет:
Отправить комментарий