Перенаправление входа в систему при несанкционированном доступе в 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, предоставляющий вам возможности для настройки нескольких приложений с использованием единого входа.