MVC web sitemi yeni OpenID Connect standardını kullanacak şekilde yükseltmeye çalışıyorum. OWIN katman yazılımı oldukça sağlam görünüyor, ancak maalesef sadece "form_post" yanıt tipini destekliyor. Bu, Google'ın uyumlu olmadığı anlamına gelir; çünkü bir "#" ifadesinden sonra tüm belirteçleri döndürür, böylece sunucuya asla ulaşmazlar ve hiçbir zaman aracıları tetiklemezler.Google OpenID Bağlantısını Doğrulama JWT ID Jetonu
Ara katmandaki yanıt işleyicilerini tetiklemeye çalıştım, ancak bu hiç işe yaramıyor gibi görünüyor, bu yüzden döndürülen istemleri ayrıştırıp bir denetleyiciye POST'ları gönderen basit bir javascript dosyası var. işlem için eylem.
Sorun, sunucu tarafında aldığımda bile onları doğru şekilde ayrıştırılamam. Hata Böyle görünüyor olsun:
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
}'."
}
Benim jeton doğrulama kodu ı İmza doğrulama JWTS ama ben için tamamen gerekli olmadığını biliyoruz 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]);
var certToken = new X509SecurityToken(certificate);
// Set up token validation
var tokenValidationParameters = new TokenValidationParameters();
tokenValidationParameters.ValidAudience = googleClientId;
tokenValidationParameters.IssuerSigningToken = certToken;
tokenValidationParameters.ValidIssuer = "accounts.google.com";
try
{
// Validate
SecurityToken jwt;
var claimsPrincipal = jwtHandler.ValidateToken(idToken, tokenValidationParameters, out jwt);
if (claimsPrincipal != null)
{
// Valid
idTokenStatus = "Valid";
}
}
catch (Exception e)
{
if (idTokenStatus != "Valid")
{
// Invalid?
}
}
}
return token.Claims;
}
private byte[][] getGoogleCertBytes()
{
// The request will be made to the authentication server.
WebRequest request = WebRequest.Create(
"https://www.googleapis.com/oauth2/v1/certs"
);
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream());
string responseFromServer = reader.ReadToEnd();
String[] split = responseFromServer.Split(':');
// There are two certificates returned from Google
byte[][] certBytes = new byte[2][];
int index = 0;
UTF8Encoding utf8 = new UTF8Encoding();
for (int i = 0; i < split.Length; i++)
{
if (split[i].IndexOf(beginCert) > 0)
{
int startSub = split[i].IndexOf(beginCert);
int endSub = split[i].IndexOf(endCert) + endCert.Length;
certBytes[index] = utf8.GetBytes(split[i].Substring(startSub, endSub).Replace("\\n", "\n"));
index++;
}
}
return certBytes;
}
gelişmekte iyi insanlar tarafından özetlenen örneği aşağıda nasıl kapatılacağı hakkında en ufak bir fikrim yok. Herhangi bir fikir?
, bu mükemmel çalıştı:
Bu artık benim çalışma kodudur. Yardım için teşekkürler. Kod şöyle görünür: 'tokenValidationParameters.IssuerSigningKeyResolver = (keyfi, ilan, bunlar, parametreler) => {yeni X509SecurityKey (sertifika) return ; }; – ReimTime
thx, eksiksizlik için yanıta eklendi –