单页应用程序模板获取不记名令牌功能不适用于grant_type密码invalid_client错误

Posted

技术标签:

【中文标题】单页应用程序模板获取不记名令牌功能不适用于grant_type密码invalid_client错误【英文标题】:single page application Template get bearer token function not working for grant_type password invalid_client error 【发布时间】:2020-08-30 20:06:55 【问题描述】:

我在 Visual Studio 2019 中实现了默认的单页应用程序模板,因为我认为这将是为 webApi 实现良好授权的最简单方法。但是,通过邮递员调用时,为 webApi 获取承载令牌的 Token 函数返回以下错误。

"error": "Invalid_client"

我敢打赌,我可能缺少一些我需要启用的配置设置,但是一些广泛的谷歌搜索并没有带来任何工作结果。任何人都知道要真正完成这项工作还缺少什么?

默认代码是 Startup.Auth.cs

static Startup()

    PublicClientId = "Web";

    OAuthOptions = new OAuthAuthorizationServerOptions
    
        TokenEndpointPath = new PathString("/Token"),
        AuthorizeEndpointPath = new PathString("/Account/Authorize"),
        Provider = new ApplicationOAuthProvider(PublicClientId),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
        AllowInsecureHttp = true
    ;


public static OAuthAuthorizationServerOptions OAuthOptions  get; private set; 

public static string PublicClientId  get; private set; 

public void ConfigureAuth(IAppBuilder app)

    app.bunchofotherregistrationsfordefaultapp();

    // Enable the application to use bearer tokens to authenticate users
    app.UseOAuthBearerTokens(OAuthOptions);

【问题讨论】:

【参考方案1】:

我绝对不推荐使用 SPA 模板来设置 WebApi 授权,但如果你想...


要完成此任务,您需要覆盖 ApplicationOAuthProvider(继承自 OAuthAuthorizationServerProvider 类)中的 2 个方法:

public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

    context.Validated(); // Set up your context to be valid every time


public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[]  "*" ); // Disable CORS policies
    var identity = new ClaimsIdentity(context.Options.AuthenticationType);

    identity.AddClaim(new Claim("email", context.UserName)); // Add required claims you want to encrypt in bearer token

    context.Validated(identity); // Return valid token

您可以在这两种方法中更改验证或授予资源逻辑以完成您的授权工作流程。至少在没有任何附加条件的情况下,我们可以收到有效的访问令牌。

【讨论】:

谢谢,我将在今天晚些时候尝试实现这一点,不过请快速跟进问题,邮递员是否因此而要求获取不记名令牌以任何方式发生变化,还是保持不变?跨度> 保持不变。请注意,您需要手动实现验证逻辑。这意味着在我的回答中,即使您没有注册用户 - 也可以授予令牌,因为不存在验证逻辑。

以上是关于单页应用程序模板获取不记名令牌功能不适用于grant_type密码invalid_client错误的主要内容,如果未能解决你的问题,请参考以下文章

一起使用不记名令牌和 cookie 身份验证

Firebase 授权不记名令牌未注册

如何使用 B2C 和 Blazor 获取 JWT 不记名令牌

Symfony 在哪里存储和获取不记名令牌并做出反应?

如何在客户端持久保存不记名令牌

在 twitter 中获取不记名令牌的问题