总是从 Identity Server 获取“invalid_client”

Posted

技术标签:

【中文标题】总是从 Identity Server 获取“invalid_client”【英文标题】:Always getting "invalid_client" from Identity Server 【发布时间】:2020-07-14 18:00:03 【问题描述】:

一切似乎正常,但它不起作用,它返回“Invalid_Client” - (400 - 错误请求)。 下面两边都这么简单;

身份服务器代码:

                new Client
                
                    ClientId = "js",
                    ClientSecrets = 
                        new Secret("secret".Sha256())
                    ,
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    RequireClientSecret = false,
                    AllowedScopes =
                    
                        "api1"
                    
                

javascript 客户端代码:

axios.post('http://localhost:5000/connect/token',request, 
        headers: 
             'client_id' : 'js',
             'client_secret' : 'secret',
             'grant_type': 'client_credentials',
             'scope' : 'api1'

             );

【问题讨论】:

【参考方案1】:

参数应该在请求体而不是请求头中传递,您可以将客户端脚本修改为:

const params = new URLSearchParams();
params.append('client_id', 'js');
params.append('client_secret', 'secret');
params.append('grant_type', 'client_credentials');
params.append('scope', 'api1');

axios.post('http://localhost:5000/connect/token', params, 
    headers: 
        'Content-Type': 'application/x-www-form-urlencoded',
    
).then(function (response) 
    console.log(response.data);

);

另外配置CORS是在客户端配置上使用AllowedCorsOrigins集合:

new Client

    ClientId = "js",
    ClientSecrets = 
        new Secret("secret".Sha256())
    ,
    AllowedCorsOrigins= new List<string>()  "http://localhost:5002" ,
    AllowedGrantTypes = GrantTypes.ClientCredentials,
    RequireClientSecret = false,
    AllowedScopes =
    
        "api1"
    
,

【讨论】:

【参考方案2】:

不应使用 normall fetch 或轴。

因为该服务是 Oauth 服务,应该使用 'client-oauth2' 库。

代码示例:

     var ClientOAuth2 = require("client-oauth2");
     var authRequest = new ClientOAuth2(
     clientId: IDENTITY_CONFIG.client_id,
     clientSecret: IDENTITY_CONFIG.client_secret,
     accessTokenUri: IDENTITY_CONFIG.token_endpoint,
     scopes: [IDENTITY_CONFIG.grantType]
  );

  return authRequest.credentials.getToken();

【讨论】:

以上是关于总是从 Identity Server 获取“invalid_client”的主要内容,如果未能解决你的问题,请参考以下文章

Reset Identity Column Value in SQL Server (Identity Reset)

React Template w/Identity Server not working in .NET 6 - Bearer error The issuer is invalid

如何使用 Sql Server 2008 获取用于插入到 select 中的 scope_identity 列表?

oidc-client-js 未从 Identity Server 4 正确获取声明

使用ORCID凭据通过Identity Server登录我的应用程序

ASP.NET 核心 blazor webassembly 为 Identity Server 4 Postman 测试获取令牌