如何解决 asp.net 核心 Blazor 应用程序中的 oAuth 身份验证

时间:2021-01-21 22:01:16

标签: .net-core oauth blazor blazor-server-side

我正在尝试在 Asp.Net Core Blazor 应用程序中设置 Strava 身份验证(即普通的 oAuth2)。 我是 Blazor 和 Web 开发人员的新手(更多是后端背景),我似乎没有找到如何解决身份验证不起作用的原因。

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

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

这是我配置身份验证设置的 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 个答案:

答案 0 :(得分: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"
  2. 然后我发现 var info = await _signInManager.GetExternalLoginInfoAsync(); 总是产生一个 null 值。那是因为我必须将 IdentityScheme 设置为外部。 ```
  3. 在那之后,我不得不运行一些自定义逻辑来进行声明映射。其中大部分细节都由@Morgeh 在 this stackoverflow post 中写下。

希望这可以在未来帮助人们。

相关问题