Я мигрирую приложение 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