我总是从IdentityServer3获得Bad Request 400。我现在正在尝试3天,但没有运气:(任何人都可以告诉我,我做错了什么?
我正在尝试访问由我无法控制的其他供应商托管的IdentityServer3。供应商要求我们使用Bearer令牌实施实施OAuth2身份验证。供应商向我们提供了客户端ID,客户端密钥和要使用的URL为http://www.xxxxxx.com/identity/connect/token
供应商告诉我们使用请求承载令牌并在请求标头中使用它授权:承载
我可以从供应商处成功获取持有人令牌。但是,当我打电话给 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”:[ “轮廓”, “offline_access”], “claims_supported”:[]
谢谢。
答案 0 :(得分:0)
供应商期望标题中有额外的价值。由于我的请求缺少额外的值,他们返回了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;
tokenresponse:" Bad Request 400"
clientresult:"标题中缺少CompanyID"
然后我知道他们也希望在标题中使用companyid,所以我添加了它。然后一切都很好。
client.DefaultRequestHeaders.Add("CompID", "xxxxxx");
答案 1 :(得分:0)
对于不同的资源而非身份服务器,我遇到了类似的错误(响应状态代码未指示成功:400(错误请求))。我设法使用FormUrlEncodedContent
解决了该问题请参考以下代码
.col-md-6
span#clock.clock
.col-md-6
p= mensaje