Ограничить регистрацию учетной записи только администраторами с аутентификацией asp. net - PullRequest
0 голосов
/ 05 августа 2020
• 1000 *

Я использую учетные записи пользователей Identity, созданные для Blazor. Такие решения, как this , по крайней мере, отключают регистрацию, но оттуда мне нужно снова включить ее для пользователей с правами администратора. Я попытался воссоздать страницу регистрации как компонент Blazor, однако использование сгенерированной модели RegisterModel у меня не сработало.

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

После большого количества поисков ответ оказался относительно простым. Решение Мухаммада Хаммада Маруфа, хотя и технически правильное, сбило меня с толку и было в основном бесполезным для работы со страницей реестра, в частности. для настройки ролей:

@code {
    protected override async Task OnParametersSetAsync()
    {
        await SetUpAuth();
    }

    private async Task SetUpAuth()
    {
        const string Manager = "Manager";
        string[] roles = { Manager };

        foreach (var role in roles)
        {
            var roleExist = await roleManager.RoleExistsAsync(role);

            if (!roleExist)
            {
                await roleManager.CreateAsync(new IdentityRole(role));
            }


        }

        var user = await userManager.FindByEmailAsync(config.GetValue<string>("AdminUser"));

        if (user != null)
        {
            await userManager.AddToRoleAsync(user, Manager);
        }
    }
}

Разрешить соответствующему пользователю быть отмеченным как администратор. На этой странице есть тег [AllowAnonymous], позволяющий пользователю с правами администратора, как указано в "AdminUser": "SomeEmail@test.com" на странице appsettings. json, иметь доступ к сайту при начальной настройке.

Предотвратить доступ к самому сайту Blazor от анонимных пользователей было так же просто, как добавить эту строку в ConfigureServices в классе запуска (код взят из Microsoft Docs )

services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();

Таким образом, разрешить доступ к странице регистрации было значительно проще, чем я думал изначально (вероятно, из-за отсутствия у меня опыта. net). Для этого все, что вам нужно сделать, это найти страницу Register.cs html .cs (я изначально не мог найти метод контроллера, упомянутый Мухаммедом), что я сделал, используя визуальную студию, чтобы щелкнуть правой кнопкой мыши по модели регистрации и затем go до определения. Это приведет вас к странице Register.cs html .cs с классом RegisterModel. Чтобы ограничить доступ к этой странице только для определенной роли пользователей c, все, что вам нужно сделать, это изменить тег [AllowAnonymous] над классом, чтобы он выглядел примерно так:

[Authorize(Roles ="Manager")]
public class RegisterModel : PageModel

Это Важно отметить, что тот же метод, который использовался для защиты страницы регистрации, можно использовать для защиты любой из других шаблонных страниц идентификации. Для приложений, в которых у вас может быть несколько ролей, предложенный Мухаммедом метод использования авторизации на основе политик может быть способом go, а эта ссылка, которую он предоставил , является отличным руководством по настройке и используя эту форму аутентификации.

0 голосов
/ 06 сентября 2020
//FORCE autentication for all RAZOR PAGES except [AllowAnonymous]
services.AddControllers(config => {
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});

Только добавление этого кода в мой startup.cs решило мою проблему.

0 голосов
/ 05 августа 2020

Вот как я это делаю в asp. net core mvc app C# Класс запуска:

 public void ConfigureServices(IServiceCollection services)
   {   
     services.AddAuthorization(options =>
      {
      options.AddPolicy(ADMIN_ACCESS, policy => policy.RequireRole($"{UserType.Admin}"));
       });
     }
              
[Authorize("AdminAccess")]
public class AdminController : Controller
{
//Some action methods here
}
  
...