#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);
}
}