IdentityServer3 响应状态码不表示成功:400(Bad Request)

IdentityServer3 Response status code does not indicate success: 400 (Bad Request)

我总是从 IdentityServer3 收到 Bad Request 400。我现在尝试了 3 天,但没有成功:( 谁能告诉我我做错了什么?

我正在尝试访问由我无法控制的另一家供应商托管的 IdentityServer3。供应商要求我们使用 Bearer 令牌实施 Implement OAuth2 身份验证。供应商向我们提供了 Client ID、Client Secret,要使用的 URL 是 http://www.xxxxxx.com/identity/connect/token

供应商告诉我们使用请求不记名令牌并在请求中使用它headers授权:不记名

我可以成功地从供应商那里获得不记名令牌。但是当我打电话给 GET /api/profiles/myemailaddress@gmail.com 我收到错误请求 400

这是我所做的:

TokenClient client = new TokenClient("http://www.xxxxxx.com/identity/connect/token", "myclientid", "myclientsecret", AuthenticationStyle.PostValues);
var response = await client.RequestResourceOwnerPasswordAsync("myemailaddress@gmail.com", "mypassword", "profile"); // successfully gives me the token

我获得了访问令牌,现在我想使用该令牌来请求用户配置文件:

var clienthttp = new HttpClient();
clienthttp.BaseAddress = new Uri("http://www.xxxxxx.com");
clienthttp.SetBearerToken(response.AccessToken);
var json = await clienthttp.GetStringAsync("http://www.xxxxxx.com/api/profiles/myemailaddress@gmail.com"); // error Bad Request 400

附加信息: "scopes_supported":["profile","offline_access"], "claims_supported":[]

谢谢。

供应商期望在 header 中获得额外价值。由于我的请求缺少该附加值,他们返回了 Bad Request。我不得不修改我的代码以找到错误请求的确切原因。

这是更新后的代码,可能对某些人有用:

        var client = new HttpClient();
        client.BaseAddress = new Uri("http://www.xxxxx.com");
        client.SetBearerToken(response.AccessToken);
        var callApiResponse = client.GetAsync("api/profiles/myemailaddress@gmail.com").Result;
        string tokenresponse = callApiResponse.StatusCode.ToString();
        string clientresult = callApiResponse.Content.ReadAsStringAsync().Result;

令牌响应:"Bad Request 400"

客户结果:"Missing CompanyID in the header"

然后我知道他们也希望 header 中有 companyid,所以我添加了它。然后一切都很好。

client.DefaultRequestHeaders.Add("CompID", "xxxxxx");

对于不同的资源而不是身份服务器,我有一个类似的错误(响应状态代码不表示成功:400(错误请求))。我设法使用 FormUrlEncodedContent

解决了这个问题

参考以下代码

           using (HttpClient client = new HttpClient())
        {
            string baseUrl = "https://*******.com/****"
            Dictionary<string, string> jsonValues = new Dictionary<string, string>();
            jsonValues.Add("username", "******");
            jsonValues.Add("password", "******");

            var contenta = new FormUrlEncodedContent(jsonValues);

            var response = await client.PostAsync(baseUrl, contenta);

            using (HttpContent content = response.Content)
            {
                string data = await content.ReadAsStringAsync();
                if (data != null)
                {
                    Console.WriteLine(data);
                }
            }
        }