Identity Server 4 和 3 之间的安全令牌验证
Security token validation between Identity Server 4 and 3
我正在尝试在 .Net Core 2.0 上使用 IdS4 服务器,在 .Net45 上使用 IdS3 webforms 客户端。
当我通过客户端登录时,我在客户端浏览器上收到此异常。
[SecurityTokenSignatureKeyNotFoundException: IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 2,
Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1),
Clause[1] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
)
',
token: '{"alg":"RS256","kid":"6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1","typ":"JWT",
"x5t":"a3rMUgMFv9tPclLa6yF3zAkfquE"}.{"nbf":1517303703,"exp":1517304003,
"iss":"http://localhost:5000","aud":"webforms","nonce":"636529004845229500.Mjg4YmMxMGEtZjk2MC00YWY5LWJiNTQtYmU0Njg0MDIwYTFhNzczN2Q1ZGMtN2YxYy00NGJmLWJhNzItNTM1ZDc0OTMyNzBj",
"iat":1517303703,"c_hash":"6Sty4gdTWGo4nEo0V_VSVQ","sid":"17936a127b0267d2588646052c4447c6",
"sub":"6498d093-8dc3-4d69-988e-3914d564f4d0","auth_time":1517303700,
"idp":"local","amr":["pwd"]}'.]
我第一次在没有 Clause[0] 的情况下得到这个异常,我认为这是因为我使用的两个样本中嵌入了不同的证书。
我尝试解决此问题涉及根据 this 指南创建新证书。
在 IdS4 启动中我有
services.AddIdentityServer()
.AddSigningCredential(GetSigningCredential())
和
private X509Certificate2 GetSigningCredential()
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySerialNumber, "3506fe4f69dc22b340e9c2af500d4659", false);
store.Close();
return certs[0];
}
将客户端机密设置为 X509 指纹。
这似乎有效。在 IdS3 客户端上,我找不到验证安全令牌的方法,我假设这将通过验证证书来完成?
如果有人能帮助我更好地理解我的问题,那就太好了,我找不到任何与我的案例相关的有用文档或示例,所以几乎任何东西都会有所帮助。
提前致谢。
原来我试图在错误的地方进行验证。我所要做的就是指向客户端 Startup.cs
.
中的证书
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Configuration = new OpenIdConnectConfiguration()
{
// Other Stuff...
SigningTokens = { new X509SecurityToken(GetX509Certificate2()) },
// More Stuff...
其中 GetX509Certificate2()
是:
private X509Certificate2 GetX509Certificate2()
{
var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
return cert = store.Certificates.Find(X509FindType.FindByThumbprint, "**thumbprint**", false)[0];
}
我正在尝试在 .Net Core 2.0 上使用 IdS4 服务器,在 .Net45 上使用 IdS3 webforms 客户端。
当我通过客户端登录时,我在客户端浏览器上收到此异常。
[SecurityTokenSignatureKeyNotFoundException: IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 2,
Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1),
Clause[1] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
)
',
token: '{"alg":"RS256","kid":"6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1","typ":"JWT",
"x5t":"a3rMUgMFv9tPclLa6yF3zAkfquE"}.{"nbf":1517303703,"exp":1517304003,
"iss":"http://localhost:5000","aud":"webforms","nonce":"636529004845229500.Mjg4YmMxMGEtZjk2MC00YWY5LWJiNTQtYmU0Njg0MDIwYTFhNzczN2Q1ZGMtN2YxYy00NGJmLWJhNzItNTM1ZDc0OTMyNzBj",
"iat":1517303703,"c_hash":"6Sty4gdTWGo4nEo0V_VSVQ","sid":"17936a127b0267d2588646052c4447c6",
"sub":"6498d093-8dc3-4d69-988e-3914d564f4d0","auth_time":1517303700,
"idp":"local","amr":["pwd"]}'.]
我第一次在没有 Clause[0] 的情况下得到这个异常,我认为这是因为我使用的两个样本中嵌入了不同的证书。
我尝试解决此问题涉及根据 this 指南创建新证书。
在 IdS4 启动中我有
services.AddIdentityServer()
.AddSigningCredential(GetSigningCredential())
和
private X509Certificate2 GetSigningCredential()
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySerialNumber, "3506fe4f69dc22b340e9c2af500d4659", false);
store.Close();
return certs[0];
}
将客户端机密设置为 X509 指纹。
这似乎有效。在 IdS3 客户端上,我找不到验证安全令牌的方法,我假设这将通过验证证书来完成?
如果有人能帮助我更好地理解我的问题,那就太好了,我找不到任何与我的案例相关的有用文档或示例,所以几乎任何东西都会有所帮助。
提前致谢。
原来我试图在错误的地方进行验证。我所要做的就是指向客户端 Startup.cs
.
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Configuration = new OpenIdConnectConfiguration()
{
// Other Stuff...
SigningTokens = { new X509SecurityToken(GetX509Certificate2()) },
// More Stuff...
其中 GetX509Certificate2()
是:
private X509Certificate2 GetX509Certificate2()
{
var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
return cert = store.Certificates.Find(X509FindType.FindByThumbprint, "**thumbprint**", false)[0];
}