C# 使用JWT C“httpClient响应返回”请求访问令牌;输入不是有效的base-64字符串…“;

C# 使用JWT C“httpClient响应返回”请求访问令牌;输入不是有效的base-64字符串…“;,c#,jwt,httpclient,C#,Jwt,Httpclient,请参阅下面的代码。我在网上发现了以下错误 var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 错误:输入不是有效的Base-64字符串,因为它包含 非基64字符、两个以上填充字符或非法字符 填充字符中的字符 不知道我做错了什么。请帮忙 使用系统; 使用System.Collections.Generic; 使用System.IO; 使用System.Threading.Tasks; 使用Syst

请参阅下面的代码。我在网上发现了以下错误

var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
错误:输入不是有效的Base-64字符串,因为它包含 非基64字符、两个以上填充字符或非法字符 填充字符中的字符

不知道我做错了什么。请帮忙

使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Threading.Tasks;
使用System.IdentityModel.Tokens;
使用System.Security.Cryptography;
使用Org.BouncyCastle.OpenSsl;
使用Org.BouncyCastle.Security;
使用Org.BouncyCastle.Crypto;
使用Org.BouncyCastle.Crypto.Parameters;
Net系统;
使用Newtonsoft.Json;
使用System.Net.Http;
使用System.Net.Http.Header;
名称空间控制台EAPP1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串privateKeyFilePath=“C:\\Users\\privateKey.txt”;
字符串私钥;
字符串clientId=“myclientid”;
字符串serraviewUri=”https://instance.serraview.com";
尝试
{
privateKey=File.ReadAllText(privateKeyFilePath);
}
捕获(例外情况除外)
{
返回;
}
//使用BouncyCastle库将PEM转换为RSA。
var rsa=new RSACryptoServiceProvider();
rsa参数rsa参数;
使用(var privateKeyReader=新StringReader(privateKey))
{
var pemReader=新的pemReader(privateKeyReader);
var keyPair=(asymmetricipherkeypair)pemReader.ReadObject();
var privKey=(RsaPrivateCrtKeyParameters)keyPair.Private;
rsapameters=DotNetUtilities.ToRSAParameters(privKey);
}
rsa.输入参数(rsa参数);
//Serraview授权服务器支持的唯一签名算法是使用SHA-256哈希算法的RSA。
var signingKey=新的RsaSecurityKey(rsa);
var signingCredentials=新的signingCredentials(signingKey,SecurityAlgorithms.RSASA256签名,SecurityAlgorithms.SHA256摘要);
//获取JWT的访问群体。这将是我们请求访问令牌的授权服务器的url。
Uri;
TryCreate(serraviewUri,UriKind.Absolute,out-Uri);
Uri受众;
if(!Uri.TryCreate(Uri,“/oauth2/token”,out观众))
{
返回;
}
//构建JWT
var jwt=新的JwtSecurityToken(
clientId,
观众。ToString(),
无效的
DateTime.UtcNow/*不在*/,,
DateTime.UtcNow.AddMinutes(5)/*到期*/,,
签署证书);
//将jwt对象序列化为实际的jwt字符串
var jwtString=new JwtSecurityTokenHandler().WriteToken(jwt);
//请求访问令牌
//Serraview服务器需要TLS1.2
ServicePointManager.SecurityProtocol=SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
字符串访问令牌;
使用(var client=new System.Net.Http.HttpClient())
{
client.BaseAddress=uri;
var content=new System.Net.Http.FormUrlEncodedContent(
新[]
{
新的KeyValuePair(“授权类型”,“urn:ietf:params:oauth:grant-type:jwt-bearer”),
新的KeyValuePair(“断言”,jwtString)
});
var response=client.PostAsync(“/oauth2/token”,content.GetAwaiter().GetResult();
var result=response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
动态parsedJson=JsonConvert.DeserializeObject(结果);
accessToken=parsedJson[“访问令牌”];
}
Console.WriteLine(accessToken);
Console.Read();
}
}
}
我试过webclient和同样的问题。响应返回200,但将其编码为字符串后输出“错误:输入…”

以下是SerraView API文档的一部分。

我已经和邮递员一起测试过了,它抛出了“不支持的grant_类型”

如果可以,请进入该页面查看API请求返回的内容。或者使用类似fiddler的工具记录流量。您也可以尝试system.net.webrequest或WebClient。感谢John的回复。我尝试了WebClient,结果也是一样。为了澄清,没有抛出任何异常。它只是输出“错误:输入无效…”请查看原始帖子。您是否可以尝试在更传统的样式var response=wait client.PostAsync(“/oauth2/token”,content)中使用wait;您还需要将Main从void更改为async task,我尝试使用wait(请参见上文)——同样的问题@Twisted如果您的邮递员请求不正确,请从params选项卡中删除“grant_type”和“assertion”,并将它们添加到body->x-www-form-urlencoded部分。如果可以,请进入该部分查看API请求返回的内容。或者使用类似fiddler的工具记录流量。您也可以尝试system.net.webrequest或WebClient。感谢John的回复。我尝试了WebClient,结果也是一样。为了澄清,没有抛出任何异常。它只是输出“错误:输入无效…”请查看原始帖子。您是否可以尝试在更传统的样式var response=wait client.PostAsync(“/oauth2/token”,content)中使用wait;您还需要将Main从void更改为async task,我尝试使用wait(请参见上文)——同样的问题@Twisted如果您的邮递员请求不正确,请从参数选项卡中删除“授权类型”和“断言”,并将它们添加到body->x-www-form-urlencoded部分下。