ASP.NET Core 2.2 атрибут авторизации с ролями не работает - PullRequest
1 голос
/ 09 июня 2019

Я мигрирую приложение ASP.NET 4.6 MVC в Asp.Net Core 2.2. Мне удалось перенести все данные. Я проверил таблицы AspNetUsers, AspNetRoles и AspNetUserRoles, и у них есть перенесенные данные. Я создал леса на страницах Login и AccessDenied, используя библиотеку классов Razor согласно официальным документам

[https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio]

Мой сценарий следующий: у меня есть контроллер с именем Leads, у которого есть действие с именем Create. Я хочу, чтобы только те пользователи, которые принадлежат роли CreateLead, получили доступ к действию Create. В целях тестирования я настроил ее на страницу по умолчанию, поэтому при запуске приложения оно перенаправляет пользователя на страницу входа в систему, поскольку действие защищено атрибутом Authorize. Если пользователь аутентифицирован, он будет перенаправлен на контроллер Leads.

Я могу успешно войти в систему, используя свое имя пользователя и пароль, хранящиеся в таблице AspNetUsers. Если я добавлю атрибут Authorize без , указав свойство Role и без добавления расширения AddRoles в классе запуска , я успешно перенаправлюсь в представление Create.

 [Authorize]
 public IActionResult Create()
 {
     return View();
 }

Класс запуска

services.AddDefaultIdentity<User>()
      .AddEntityFrameworkStores<SalesIdentityContext>();

Однако, если я укажу свойство Roles и добавлю расширение AddRoles в класс Startup , как показано ниже, браузер не загрузит представление. Это дает мне следующую ошибку: веб-страница на https://localhost:44388/ может быть временно недоступна или она постоянно перемещена на новый веб-адрес: ERR_SPDY_PROTOCOL_ERROR.

[Authorize( Roles = "CreateLead")]
public IActionResult Create()
{
    return View();
}

Класс запуска:

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<SalesIdentityContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("IdentityConnection")));

        services.AddDefaultIdentity<User>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<SalesIdentityContext>();

        services.ConfigureApplicationCookie(options =>
        {
            // Cookie settings
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
            options.LoginPath = "/Identity/Account/Login";
            options.AccessDeniedPath = "/Identity/Account/AccessDenied";
            options.SlidingExpiration = true;
        });

        // Add application services.
        services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>));
        services.AddScoped<ILeadService, LeadService>();

        services.AddHttpClient("my_api_client_name", c => 
        {
            c.BaseAddress = "my_api_uri");
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            ListAllRegisteredServices(app);
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            //app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(name: "default", template: "{controller=Leads}/{action=Create}/{id?}");
        });
    }

У меня есть собственный класс идентификации с именем User, который расширяет класс IdentityUser. В классе User я добавил свойства FirstName и LastName.

Я проверил таблицу AspNetUserRoles и могу подтвердить, что доступны как UserId, так и RoleId.

Вывод Visual Studio Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler: Информация: AuthenticationScheme: Identity.Application вошел в систему. WebApp.Areas.Identity.Pages.Account.LoginModel: Информация: пользователь вошел в систему. Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker: Информация: выполнен метод обработчика OnPostAsync, возвращен результат Microsoft.AspNetCore.Mvc.LocalRedirectResult. Microsoft.AspNetCore.Mvc.Infrastructure.LocalRedirectResultExecutor: Информация: Выполнение LocalRedirectResult, перенаправление на /. Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker: Информация: выполненная страница / учетная запись / вход в систему в 10100.4486 мс Microsoft.AspNetCore.Routing.EndpointMiddleware: Информация: Выполненная конечная точка «Страница: / Учетная запись / Логин» Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос завершен в 10232.1354мс 302

1 Ответ

0 голосов
/ 09 июня 2019

Вам не хватает addauthorization после addmvc. В Configure service method измените его следующим образом: services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddAuthorization();

...