ASP.NET Core Identity: как переопределить запрещенную обработку - PullRequest
1 голос
/ 09 июня 2019

Ситуация: я возвращаю Forbid() из PageModel, и это инициирует ответ с перенаправлением (302) на /AccessDenied&returnUrl=...

Здесь я указываю путь:

 // configuration was used
 serviceCollection.ConfigureApplicationCookie(options =>
 {
     options.AccessDeniedPath = new PathString("/AccessDenied");
 });

Но как я могу полностью переопределить создание «ответа на перенаправление» и указать свои собственные параметры GET (что-то вроде returnUrl) или переопределить значение returnUrl (я хочу передать свое собственное значение, сохраненное в пользовательском запросе особенность )

В качестве альтернативы вместо возврата Forbid() я могу перенаправить в AccessDenied вручную. Но я хотел бы остаться с Forbid() для наглядности и последовательности.

ОБНОВЛЕНИЕ: это тоже не работает

public void ConfigureServices(IServiceCollection serviceCollection)
    {
        serviceCollection.ConfigureApplicationCookie(options =>
        {
            //options.AccessDeniedPath = new PathString("/AccessDenied");
            options.Events.OnRedirectToAccessDenied = context =>
            {
                context.Response.Redirect("/AccessDenied&t=100");
                return Task.CompletedTask;
            };
        });

        // need for password reset functionality
        serviceCollection.AddDbContext<WebUserDbContext>(optionsBuilder =>
            optionsBuilder.UseSqlServer(ApplicationSettings.WebUserStorageConfiguration.ConnectionString));

        serviceCollection.AddIdentity<WebUser, IdentityRole<int>>( options =>
            {
                options.SignIn.RequireConfirmedEmail = true;
            })
            .AddEntityFrameworkStores<WebUserDbContext>()
            .AddDefaultTokenProviders();

        // generally it is a version of routin by 

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

P.S. Это сервисный сайт, который не требует идентификации для аутентификации, но управляет записями пользователей. Таким образом, аутентификация MS Identity Lib не включена для сайта. Типы удостоверений только что были добавлены в контейнер, потому что мне нужны специальные функции Identity API: «сброс пароля» Это идиотская ситуация: UserManager так же классы Identity API настолько сложны, что их невозможно построить иначе, чем получить из DI / контейнера. Пожалуйста, не делитесь этим безумием MS DI в ваших API.

Интересно, что без serviceCollection.AddIdentity браузер получит «Ошибка 500» на .Forbid(), а точка останова все равно не остановится на context.Response.Redirect("/AccessDenied&t=100");

1 Ответ

1 голос
/ 09 июня 2019

Перенаправление на настроенный AccessDeniedPath является поведением по умолчанию для аутентификации cookie.Он автоматически добавит параметр returnUrl, который по умолчанию используется для текущего URL.Если вы укажете RedirectUri внутри свойств аутентификации, вместо этого будет использоваться этот URL.

Например, внутри контроллера:

return Forbid(new AuthenticationProperties
{
    RedirectUri = Url.Action("ActionAfterForbid"),
});

Это в основном приведет к перенаправлению наURL {AccessDeniedPath}?returnUrl=/exampleController/ActionAfterForbid.

Если вам нужна дополнительная настройка, вы также можете переопределить RedirectToAccessDenied событие параметров аутентификации cookie:

services.ConfigureApplicationCookie(options =>
{
     options.Events.OnRedirectToAccessDenied = context =>
     {
         // context.Options.AccessDeniedPath would be the configured path
         // context.RedirectUri is the passed or automatically set up redirect URI
         // context.HttpContext is the HttpContext if you want to modify features

         // default behavior is basically this:
         context.Response.Redirect(context.RedirectUri);
         return Task.CompletedTask;
     };
});

Там,Вы можете делать все, что захотите.

Обратите внимание, что вам нужно будет позвонить ConfigureApplicationCookie после вызова AddIdentity.Это связано с тем, что последний настроит сам файл cookie приложения с некоторыми значениями по умолчанию, поэтому, если вы настроите события аутентификации, они будут перезаписаны на AddIdentity.Вместо этого вы хотите перезаписать значения по умолчанию с помощью ConfigureApplicationCookie, поэтому вы должны вызвать его позже.

...