ASP.NET Core 2.1: Razor Pages - авторизация на основе ролей не работает - PullRequest
0 голосов
/ 26 мая 2018

Приложение My Razor Pages настроено следующим образом.Startup.cs содержит:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdminRole", policy => 
            policy.RequireAuthenticatedUser().RequireRole("Admin"));
    });

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizePage("/About", "RequireAdminRole");
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();
    app.UseMvc();
}

У меня есть пользователь с ролью «Администратор».Когда пользователь входит в систему и получает доступ к странице «О программе», я получаю следующее:

Доступ запрещен

У вас нет доступа к этому ресурсу.

Что я делаю не так?

ОБНОВЛЕНИЕ

Если я удаляю AuthorizePage и использую GetUsersInRoleAsync("Admin") в методе About.cshtml.cs page OnGet, выведите UserName свойство на странице About.cshtml, отображается администратор.Поэтому не уверен, почему AuthorizePage не работает.

ОБНОВЛЕНИЕ 29-May-2017

Мой исходный код находится в этом Github Resository

Ответы [ 4 ]

0 голосов
/ 02 августа 2018

Ответы выше не сработали для меня, но после прочтения этого на Github я изменил код с использования решения Алана Т.

services.AddIdentity<IdentityUser, IdentityRole>()
 .AddDefaultUI()
 .AddDefaultTokenProviders()
 .AddEntityFrameworkStores<ApplicationDbContext>();

На этот

  services.AddIdentity<IdentityUser, IdentityRole>()
             .AddEntityFrameworkStores<AuthenticationContext>()
          .AddDefaultUI();

.AddEntityFrameworkStores<AuthenticationContext>() должен идти после services.AddIdentity<IdentityUser, IdentityRole>()

. Он отлично работает.Я не использую двухфакторную аутентификацию, поэтому мне не нужна .AddDefaultTokenProviders()

Надеюсь, она поможет кому-то еще, у кого была та же проблема, что и с ролями.

0 голосов
/ 04 июня 2018

Пожалуйста, измените эти строки вашего кода и попробуйте снова.Спасибо

        //Old
        /*services
            .AddDefaultIdentity<IdentityUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
            */

        //New
        services
            .AddIdentity<IdentityUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
0 голосов
/ 10 июня 2018

Мне удалось найти решение:

services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();

Я думаю, что оно работает следующим образом:

  • AddItentity - устанавливает идентификатор.
  • AddDefaultUI- Используйте новый пользовательский интерфейс библиотеки классов Razor.
  • AddDefaultTokenProviders - Необходим для двухфакторной аутентификации.
0 голосов
/ 29 мая 2018

Вы должны поставить .UseAuthentication() до .UseMvc() app.UseAuthentication(); app.UseMvc(); Я потерял много волос из-за этого.

...