代码之家  ›  专栏  ›  技术社区  ›  Shawn de Wet

如何处理OIDC服务器从ASP.Net核心应用程序

  •  0
  • Shawn de Wet  · 技术社区  · 4 年前

    我有一个ASP.Net核心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 事件,每个处理程序上都有断点。

    处理请求时发生未处理的异常。 SocketException:无法建立连接,因为目标计算机主动拒绝了它。

    我理解抛出异常的原因,但我不清楚如何处理它,以便向用户显示更友好的错误。我想我可以在一个更全局的异常处理程序中这样做?(仍需调查),但我预计 你知道为什么他们不会被击中吗?当然,这种情况符合 OnRemoteFailure失败

    0 回复  |  直到 4 年前
        1
  •  0
  •   Tore Nestenius    4 年前

    据我所知,有许多错误源,我们必须处理。

    如果你试图登录(挑战)的第一件事将发生的是 HandleChallengeAsyncInternal 方法,它将尝试从您的identity server下载发现文档。

    对于这个初始请求,没有错误处理,因此您需要在这里做的是在请求管道中的自定义ErrorHandlerMiddleware中捕获该异常,并从该代码中获取异常,然后将用户重定向到合适的“无法登录错误页”。

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

    然后检查源代码是否来自IdentiytModel,如果是,则重定向到其他页面,如以下示例代码:

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