如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除

Posted

技术标签:

【中文标题】如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除【英文标题】:How to troubleshoot oAuth authentication in asp.net core Blazor App 【发布时间】:2021-04-26 09:38:40 【问题描述】:

我正在尝试在 Asp.Net Core Blazor App 中设置 Strava 身份验证(即普通 oAuth2)。 我对 Blazor 和 Web 开发(更多的是后端背景)相当陌生,我似乎不知道如何解决身份验证不起作用的原因。

当我在(默认)Blazor 服务器应用程序的登录页面上单击 oAuth 登录按钮时,我会被重定向到正确的 oAuth 登录屏幕(在我的例子中是 Strava),但在我成功输入该应用程序的凭据之后,登录页面显示错误Error loading external login information.

虽然我很感激任何可以指出我的代码中的错误的帮助或提示,但我主要是在寻找一种方法来获得更好的错误信息和故障排除功能。在 EventHandler 委托中设置断点并没有显示太多。

这是我配置身份验证设置的Startup.cs 提取:

services.AddAuthentication().AddOAuth("Strava",
    oAuthOptions =>
    
        oAuthOptions.ClientId = "myappid"; 
        oAuthOptions.ClientSecret = "myclientsecret";
        oAuthOptions.Scope.Clear();        
        oAuthOptions.Scope.Add("read");
        oAuthOptions.CallbackPath = "/profile"; 
        oAuthOptions.AuthorizationEndpoint = "https://www.strava.com/oauth/authorize";
        oAuthOptions.TokenEndpoint = "https://www.strava.com/api/v3/oauth/token";
        oAuthOptions.SignInScheme = IdentityConstants.ExternalScheme;
        oAuthOptions.Events = new OAuthEvents()
        
            OnRemoteFailure = loginFailureHandler =>
            
                Console.WriteLine("Remote Error");
                Console.WriteLine(loginFailureHandler.Failure.Message);
                return Task.FromResult(0);
            , 
            OnAccessDenied = handler =>
            
                Console.WriteLine(handler.Response.StatusCode);
                return Task.FromResult(0);
            
        ;
    );

【问题讨论】:

【参考方案1】:

使事情对我有用的更新,所以也许它可以帮助其他人。

为了更好地控制整个身份验证过程,我执行了以下操作。

    我搭建了两个页面,然后我可以在其中调试和单步执行(显然还可以更新和更改内容)。更多信息见this post: Account.Login,可以自定义实际登录页面dotnet aspnet-codegenerator identity -dc CotacolApp.Data.ApplicationDbContext --files "Account.Login" Account.ExternalLogin,可以自定义实际的strava页面dotnet aspnet-codegenerator identity -dc CotacolApp.Data.ApplicationDbContext --files "Account.ExternalLogin" 然后我发现var info = await _signInManager.GetExternalLoginInfoAsync(); 总是导致null 值。那是因为我必须将 IdentityScheme 设置为外部。 ``` 之后,我必须运行一些自定义逻辑来进行声明映射。其中大部分细节由@Morgeh 写在this *** post 中。

希望这对未来的人们有所帮助。

【讨论】:

以上是关于如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

JWT 不会通过 Blazor 存储在 ASP.NET Core 中

使用 Blazor Webassembly 和 ASP.NET Core 安全文件下载

ASP.NET Core Blazor 服务器中的实体框架上下文生命周期

如何通过 IdentityServer4 将 OpenId Connect 添加到 ASP.NET Core 服务器端 Blazor Web 应用程序?

在 ASP.NET Core 站点中实现 Blazor - 组件不在视图中呈现

Blazor——Asp.net core的新前端框架