我想在C#中实现Base64 URL安全编码.在Java中,我们有一个公共Codec库,它为我提供了一个URL安全编码字符串.如何使用C#实现相同的目标?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Run Code Online (Sandbox Code Playgroud)
上面的代码将它转换为Base64,但它填充==.有没有办法实现URL安全编码?
我不明白这个库是如何工作的.请问你能帮帮我吗 ?
这是我的简单代码:
public void TestJwtSecurityTokenHandler()
{
var stream =
"eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9";
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
字符串需要采用紧凑的JSON格式,格式如下:Base64UrlEncodedHeader.Base64UrlEndcodedPayload.OPTIONAL,Base64UrlEncodedSignature'.
如果你在jwt.io网站上复制流,它工作正常:)
我正在尝试升级我的MVC网站以使用新的OpenID Connect标准.OWIN中间件看起来非常强大,但不幸的是只支持"form_post"响应类型.这意味着Google不兼容,因为它会在"#"后面的URL中返回所有令牌,因此它们永远不会到达服务器并且永远不会触发中间件.
我试图在中间件中自己触发响应处理程序,但这似乎根本不起作用,所以我有一个简单的javascript文件解析返回的声明并将它们发送到控制器动作进行处理.
问题是,即使我在服务器端获取它们,我也无法正确解析它们.我得到的错误看起来像这样:
IDX10500: Signature validation failed. Unable to resolve
SecurityKeyIdentifier: 'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 1,
Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
),
token: '{
"alg":"RS256",
"kid":"073a3204ec09d050f5fd26460d7ddaf4b4ec7561"
}.
{
"iss":"accounts.google.com",
"sub":"100330116539301590598",
"azp":"1061880999501-b47blhmmeprkvhcsnqmhfc7t20gvlgfl.apps.googleusercontent.com",
"nonce":"7c8c3656118e4273a397c7d58e108eb1",
"email_verified":true,
"aud":"1061880999501-b47blhmmeprkvhcsnqmhfc7t20gvlgfl.apps.googleusercontent.com",
"iat":1429556543,"exp\":1429560143
}'."
}
Run Code Online (Sandbox Code Playgroud)
我的令牌验证码遵循开发IdentityServer的优秀人员概述的示例
private async Task<IEnumerable<Claim>> ValidateIdentityTokenAsync(string idToken, string state)
{
// New Stuff
var token = new JwtSecurityToken(idToken);
var jwtHandler = new JwtSecurityTokenHandler();
byte[][] certBytes = getGoogleCertBytes();
for (int i = 0; i < certBytes.Length; i++)
{
var certificate = new X509Certificate2(certBytes[i]); …Run Code Online (Sandbox Code Playgroud) 我们的高级开发人员编写了以下代码,作为示例:
public class TokenParser
{
private Token token;
public Token Parse(HttpRequestMessage r)
{
IOwinContext context = r.GetOwinContext();
token = new Token();
ParseData(context);
return token;
}
private void ParseData(IOwinContext context)
{
token.Name= context.Authentication.User.Claims.Single(x => x.Type == ClaimTypes.Name).Value;
}
}
Run Code Online (Sandbox Code Playgroud)
(还有一个"Token.cs"类,它只有一个name属性作为字符串.)
我们解码的 JWT有效载荷如下所示:
{
"iss": "https://someissuer.com/",
"sub": "I want this string, atm I get it manually",
"aud": "11543fdsasf23432",
"exp": 33244323433,
"iat": 23443223434
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我尝试通过类型"sub"获取声明时,没有任何内容出现(并且它不在列表中).但"sub"似乎是一个非常普遍的主张.
我在这做错了什么?我可以获得主题("子")声明吗?
编辑:对于那些推荐system.IdentityModel - 尝试使用它时出现此错误:

我有一个用AngularJs编写的单页面应用程序(此时框架是无关紧要的)应用程序托管在IIS中,它由index.html和一堆客户端资产组成.
在后端我有WebApi 2,也作为单独的应用程序在IIS中托管.
对于客户端身份验证,我使用Firebase(简单登录),启用了几个社交网络,如Facebook,Twitter或Google.
到现在为止还挺好.我喜欢用firebase启用twitter身份验证是多么容易.
在使用社交网络登录时,我从firebase返回,firebaseAuthToken和提供者accessstoken.
现在我想使用firebaseAuthToken或提供者访问令牌来验证我的WebApi.
问题是:在给定条件下使用WebApi进行身份验证的最佳方法是什么?
因为我在服务器上安装了复杂的业务逻辑,所以没有选项只使用firebase来存储我的数据并摆脱web api.
到目前为止,我有一个愚蠢的想法是将社交提供者访问令牌传递给服务器,针对提供者验证令牌,然后使用Owin -Katana发出安全令牌.
由于缺乏文档,复杂性以及与单页应用程序的错误集成,我没有使用katana构建社交提供程序支持.我发现SPA的视觉工作室模板太具体了.但那是我:)