Перенаправление входа в систему при несанкционированном доступе в ASP.NET Core
В предыдущем ASP.NET MVC появилась возможность перенаправления на действие входа, если пользователь не был аутентифицирован.
Мне нужно то же самое с ASP.NET Core, поэтому я:
- создал проект ASP.NET Core из шаблона Visual Studio
- добавил
[Authorize]
к произвольному действию
- открыло соответствующее представление в моем браузере
Я не ожидаю перенаправления, потому что я его не настроил. НО, он автоматически перенаправляется на действие входа!
Где/как этот параметр установлен?
Ответы
Ответ 1
Вы можете настроить путь, используя класс CookieAuthenticationOptions
.
Что-то вроде этого.
app.UseCookieAuthentication(new CookieAuthenticationOptions {
LoginPath = new PathString("/Login/"),
AuthenticationType = "My-Magical-Authentication",
// etc...
},
});
Ответ 2
С текущей версией ядра aspnet (2.1.0) это изменилось, теперь использование может использовать расширения:
services.ConfigureApplicationCookie(options => options.LoginPath = "/login");
или же
services
.AddAuthentication()
.AddCookie(options =>
{
options.LoginPath = "/login";
options.LogoutPath = "/logout";
});
Вы можете узнать больше о переходе на 2.0 в этой статье.
Ответ 3
Для тех, кому это интересно, также может быть сделано с поставщиком услуг AddIdentity.
services.AddIdentity<User, IdentityRole>(options =>
{
options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
options.Cookies.ApplicationCookie.AutomaticChallenge = true;
options.Cookies.ApplicationCookie.LoginPath = "/Auth/Login";
})
.AddEntityFrameworkStores<MehandiContext>()
.AddDefaultTokenProviders();
И как объяснено здесь: fooobar.com/questions/1258712/...
Я попытался это в апреле 2017 года, а "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0"
не перенаправлял мне пришлось использовать версию 1.0.1
Ответ 4
Перенаправление не работало в моем приложении вообще, и ни одно из решений здесь не исправляло его, но с использованием Status Code Pages
:
app.UseStatusCodePages(async context =>
{
var response = context.HttpContext.Response;
if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
response.StatusCode == (int)HttpStatusCode.Forbidden)
response.Redirect("/Authentication");
});
Ответ 5
Способ, которым ядро dotnet защищает Cookie-аутентификацию, использует платформу Identity. Для нового проекта я рекомендую перейти в командную строку и сделать что-то вроде этого:
dotnet new mvc -o ExampleProject --auth Individual
Вы можете получить полный контроль над процессом аутентификации, изменив следующий метод в Startup.cs так:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
}
Ссылка:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#full
Мое личное предпочтение для аутентификации - это гибридный поток IdentityServer4, предоставляющий вам возможности для настройки нескольких приложений с использованием единого входа.