Sto tentando di creare una JWT per autorizzare con un account di servizio come descritto in Google documentation utilizzando System.IdentityModel.Tokens.Jwt. Ho il seguente codice:Come produrre JWT con l'algoritmo compatibile con Google OAuth2 RSA SHA-256 utilizzando System.IdentityModel.Tokens.Jwt?
byte[] key = Convert.FromBase64String("...");
var certificate = new X509Certificate2(key, "notasecret");
DateTime now = DateTime.UtcNow;
TimeSpan span = now - UnixEpoch;
Claim[] claims =
{
new Claim("iss", "[email protected]"),
new Claim("scope", "https://www.googleapis.com/auth/plus.me"),
new Claim("aud", "https://accounts.google.com/o/oauth2/token"),
new Claim("iat", span.TotalSeconds.ToString()),
new Claim("exp", span.Add(TimeSpan.FromHours(1)).TotalSeconds.ToString())
};
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
var descriptor = new SecurityTokenDescriptor
{
SigningCredentials = new SigningCredentials(
new InMemorySymmetricSecurityKey(key),
"http://www.w3.org/2001/04/xmldsig-more#hmac-sha256",
"http://www.w3.org/2001/04/xmlenc#sha256"),
Subject = new ClaimsIdentity(claims)
};
JwtSecurityToken jwtSecurityToken = (JwtSecurityToken)handler.CreateToken(descriptor);
string json = handler.WriteToken(jwtSecurityToken);
quali uscite:
{ "typ" : "JWT" , "alg" : "HS256" }
Mentre Google afferma esplicitamente che supporta SHA-256:
account di servizio si basano sul RSA SHA-256 Algoritmo e formato token JWT
Secondo wtSecurityTokenHandler.InboundAlgorithmMap:
RS256 => http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
HS256 => http://www.w3.org/2001/04/xmldsig-more#hmac-sha256
Così, quando posso cambiare il mio codice:
new SigningCredentials(
new InMemorySymmetricSecurityKey(key),
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
"http://www.w3.org/2001/04/xmlenc#sha256");
sto diventando un'eccezione:
System.InvalidOperationException: IDX10632: SymmetricSecurityKey.GetKeyedHashAlgorithm('http://www.w3.org/2001/04/xmldsig-more#rsa-sha256') threw an exception.
SymmetricSecurityKey: 'System.IdentityModel.Tokens.InMemorySymmetricSecurityKey'
SignatureAlgorithm: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', check to make sure the SignatureAlgorithm is supported.
significa Microsoft non supporta l'algoritmo Google supporta esclusivamente?
Forse provare a utilizzare le costanti integrate per gli algoritmi di firma e digest? (http://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securityalgorithms%28v=vs.110%29.aspx) –
@Jeff: hey, mi dispiace, ho perso la notifica del tuo commento. Buon punto Ma sfortunatamente non funziona ancora. – abatishchev