Как справиться с отключением сервера OIDC от ASP.Net Основное приложение

#openid-connect #asp.net-core-3.1

#OpenID-connect #asp.net-core-3.1

Вопрос:

У меня есть ASP.Net Приложение Core 3.1, настроенное для использования OIDCAuthentication, следующим образом:

 .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
                {
                    options.Authority = appSettings.OIDCAuthority;
                    options.ClientId = appSettings.OIDCClientId;
                    options.ClientSecret = appSettings.OIDCClientSecret;
                    options.ResponseType = OpenIdConnectResponseType.Code;
                    options.Scope.Add("profile");
                    options.SaveTokens = true;
                    options.Events = new OpenIdConnectEvents
                    {
                        OnAuthenticationFailed = (context) =>
                        {
                            return System.Threading.Tasks.Task.CompletedTask;
                        },
                        OnRemoteFailure = (context) =>
                        {
                            return System.Threading.Tasks.Task.CompletedTask;
                        },
  

Обратите внимание, что я подключился к OnRemoteFailure OnAuthenticationFailed событиям and с точками останова для каждого из этих обработчиков.

Я пытаюсь выяснить, как справиться со сценарием, в котором сервер OIDC не работает. Итак, я имитирую это в своей локальной среде отладки, НЕ запуская проект сервера идентификации. Когда приложение .Net Core перенаправляет на сервер OIDC для проверки подлинности, пользователю выдается эта ошибка:

При обработке запроса произошло необработанное исключение. Исключение SocketException: не удалось установить соединение, поскольку целевая машина активно отказалась от него.

Я понимаю, почему возникает это исключение, но мне неясно, как с ним обращаться, чтобы отобразить более понятную ошибку для пользователя. Я думаю, я мог бы сделать это в более глобальном обработчике исключений? (все еще нужно разобраться с этим), но я ожидаю, что хотя бы одна из вышеупомянутых точек останова должна быть достигнута?Есть идеи относительно того, почему они НЕ будут поражены? Конечно, этот сценарий квалифицируется как OnRemoteFailure событие?

Комментарии:

1. Был ли мой ответ приемлемым?

Ответ №1:

Насколько я понимаю, существует множество источников ошибок, с которыми нам приходится иметь дело.

Если вы попытаетесь войти в систему (вызов), первое, что произойдет, это вызов метода HandleChallengeAsyncInternal, который попытается загрузить документ обнаружения с вашего сервера идентификации.

Для этого первоначального запроса обработка ошибок не выполняется, поэтому вам нужно сделать здесь, чтобы зафиксировать это исключение в пользовательском ErrorHandlerMiddleware в вашем конвейере запросов и для исключений из этого кода перенаправить пользователя на подходящую страницу «не удается войти в систему с ошибкой».

Например, в классе Startup добавьте это промежуточное программное обеспечение:

 app.UseExceptionHandler(new ExceptionHandlerOptions
        {
            ExceptionHandler = new OAuthExceptionMiddleware(env).Invoke
        });
  

Затем проверьте, является ли источник из identitmodel, и если да, перенаправьте на какую-либо другую страницу, например, этот пример кода:

 public class OAuthExceptionMiddleware
{
    private readonly IWebHostEnvironment _environment;

    public OAuthExceptionMiddleware(IWebHostEnvironment environment)
    {
        _environment = environment;
    }

    public async Task Invoke(HttpContext context)
    {
        var ex = context.Features.Get<IExceptionHandlerFeature>()?.Error;

        if (ex == null)
        {
            return;
        }

        if(ex.Source== "Microsoft.IdentityModel.Protocols")
            context.Response.Redirect("/Home/AuthError", false);
        else
            context.Response.Redirect("/Home/Error", false);
    }
}