Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Azure Devops Oauth身份验证:无法获取访问令牌(BadRequest未能反序列化JsonWebToken对象)_Asp.net Core_Oauth_Azure Devops Rest Api - Fatal编程技术网

Asp.net core Azure Devops Oauth身份验证:无法获取访问令牌(BadRequest未能反序列化JsonWebToken对象)

Asp.net core Azure Devops Oauth身份验证:无法获取访问令牌(BadRequest未能反序列化JsonWebToken对象),asp.net-core,oauth,azure-devops-rest-api,Asp.net Core,Oauth,Azure Devops Rest Api,我正在尝试为Azure Devops的自定义webapplication实现OAUth 2.0流。我遵循此文档以及此OauthWebSample,但使用的是ASP.NET Core(我还阅读了一个类似的问题,但不是:) 繁殖 我已在注册了azdo应用程序,并且授权步骤似乎工作正常,即用户可以授权应用程序,重定向到我的应用程序会返回类似于有效jwt令牌的内容: header: { "typ": "JWT", "alg": "RS256", "x5t": "oOvcz5M_7p-HjIK

我正在尝试为Azure Devops的自定义webapplication实现OAUth 2.0流。我遵循此文档以及此OauthWebSample,但使用的是ASP.NET Core(我还阅读了一个类似的问题,但不是:)

繁殖 我已在注册了azdo应用程序,并且授权步骤似乎工作正常,即用户可以授权应用程序,重定向到我的应用程序会返回类似于有效jwt令牌的内容:

header: {
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "oOvcz5M_7p-HjIKlFXz93u_V0Zo"
}
payload: {
  "aui": "b3426a71-1c05-497c-ab76-259161dbcb9e",
  "nameid": "7e8ce1ba-1e70-4c21-9b51-35f91deb6d14",
  "scp": "vso.identity vso.work_write vso.authorization_grant",
  "iss": "app.vstoken.visualstudio.com",
  "aud": "app.vstoken.visualstudio.com",
  "nbf": 1587294992,
  "exp": 1587295892
}

下一步是获取一个访问令牌,该令牌失败于BadReqest:invalid_客户端,未能反序列化JsonWebToken对象

以下是完整的示例:

公共类配置
{
公共字符串ClientId{get;set;}=“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”;
公共字符串机密{get;set;}=“…”;
公共字符串范围{get;set;}=“vso.identity vso.work_write”;
公共字符串重定向URI{get;set;}=”https://....ngrok.io/azdoaccount/callback";
}
/// 
///在创建azdo应用程序https://app.vsaex.visualstudio.com/
///使用上述“配置”中的配置值(使用ngrok具有代理本地主机的公共url)
///导航到本地主机:5001/azdoaccount/signin
///=>重定向到https://app.vssps.visualstudio.com/oauth2/authorize 并让用户授权(似乎有效)
///=>重定向回本地主机:5001/azdoaccount/带有身份验证代码的回调
///=>发布到https://app.vssps.visualstudio.com/oauth2/token =>BadReqest:客户端无效,无法反序列化JsonWebToken对象
/// 
[路由(“[控制器]/[操作]”)]
公共类AzdoAccountController:控制器
{
私有只读配置=新配置();
[HttpGet]
公共行动结果签名()
{
Guid状态=Guid.NewGuid();
UriBuilder UriBuilder=新的UriBuilder(“https://app.vssps.visualstudio.com/oauth2/authorize");
NameValueCollection queryParams=HttpUtility.ParseQueryString(uriBuilder.Query??string.Empty);
queryParams[“client_id”]=config.ClientId;
queryParams[“响应类型”]=“断言”;
queryParams[“state”]=state.ToString();
queryParams[“scope”]=config.scope;
queryParams[“redirect_uri”]=config.RedirectUri;
uriBuilder.Query=queryParams.ToString();
返回重定向(uriBuilder.ToString());
}
[HttpGet]
公共异步任务回调(字符串代码、Guid状态)
{
字符串令牌=等待GetAccessToken(代码、状态);
返回Ok();
}
公共异步任务GetAccessToken(字符串代码、Guid状态)
{
字典形式=新字典()
{
{“客户端断言类型”,“urn:ietf:params:oauth:client断言类型:jwt bearer”},
{“client_断言”,config.Secret},
{“grant_type”,“urn:ietf:params:oauth:grant type:jwt bearer”},
{“断言”,代码},
{“redirect_uri”,config.RedirectUri}
};
HttpClient HttpClient=新HttpClient();
HttpResponseMessage responseMessage=等待httpClient.PostAsync(
"https://app.vssps.visualstudio.com/oauth2/token",
新表单UrlEncodedContent(表单)
);
if(responseMessage.IsSuccessStatusCode)//对我来说总是false
{
string body=await responseMessage.Content.ReadAsStringAsync();
//TODO解析正文并返回访问令牌
返回“”;
}
其他的
{
//请求错误({“Error”:“invalid_client”,“ErrorDescription”:“未能反序列化JsonWebToken对象。”})
string content=await responseMessage.content.ReadAsStringAsync();
抛出新异常($“{responseMessage.ReasonPhrase}{(string.IsNullOrEmpty(content)?”“:$”({content})}”);
}
}
}

当请求访问令牌时,必须为客户端断言提供客户端机密而不是应用机密


当请求访问令牌时,必须为客户端断言参数提供客户端机密,而不是应用机密


感谢您在此处分享您的解决方案,请接受您的解决方案作为答案?因此,它将有助于其他成员谁得到同样的问题,找到解决办法容易。祝你有一个愉快的一天:)谢谢你的回答,按照你的步骤现在我得到以下错误。“Error:“unauthorized_client”,“ErrorDescription:“Base-64 char数组或字符串的长度无效。”感谢您在此处共享您的解决方案,请接受您的解决方案作为答案?因此,它将有助于其他成员谁得到同样的问题,找到解决办法容易。祝你有一个愉快的一天:)谢谢你的回答,按照你的步骤现在我得到以下错误。“错误”:“未经授权的\u客户端”,“错误描述”:“Base-64字符数组或字符串的长度无效。”