Microsoft 无需重定向即可登录 url

Microsoft sign in works without redirect url

当我在我的 Blazor 应用程序中使用 Microsoft OAuth 登录时,authenticateResult.Succeeded 为真,即使我没有指定重定向 URI。 Google,如果我不将我的 URI 添加到 OAuth 客户端,它就会失败。

Imo,根据 OAuth2.0 规范,没有该重定向 URI 就无法工作:

The authorization server MUST require public clients and SHOULD require confidential clients to register their redirection URIs.

我正在使用 Microsoft.AspNetCore.Authentication.MicrosoftAccount 3.0.3 和 .NET Core 3.0

public class ExternalLoginModel : PageModel
{
    public IActionResult OnGetAsync(string externalAuthType, string returnUrl)
    {
        var authenticationProperties = new AuthenticationProperties
        {
            RedirectUri = Url.Page("./externallogin",
            pageHandler: "Callback",
            values: new { returnUrl }),
        };

        return new ChallengeResult(externalAuthType, authenticationProperties);
    }

    public async Task<IActionResult> OnGetCallbackAsync(
        string returnUrl = null, string remoteError = null)
    {
        var authenticateResult = await HttpContext.AuthenticateAsync("External");

        if (!authenticateResult.Succeeded) // Should be false for Microsoft sign in
            return BadRequest();

        ...

        return LocalRedirect(returnUrl);
    }
}

将以下内容添加到我的 Startup 中:

        services.AddAuthentication(o =>
        {
            o.DefaultSignInScheme = "External";
        }).AddCookie("External");
        services.AddAuthentication().AddGoogle(google =>
        {
            google.ClientId = Configuration["Authentication:Google:ClientId"];
            google.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
        });
        services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
        {
            microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
            microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
        });

我的应用程序的身份验证设置如下所示(我实际上在设置中使用 localhost:12345,但这不是我的应用程序在 运行 上的设置..):

具有讽刺意味的是,最后一句话可能会解释它,但我什至不知道 MicrosoftAccount 库使用的是哪个流程,我只能在谷歌搜索时获得通用文档。

当使用完全不同的域而不是具有不同端口的本地主机时,它会按预期失败。我想这已经足够了。

此外,我未选中 "ID token" 和 "Treat application as a public client",因此据我所知,应该使用 授权代码流