gpt4 book ai didi

c# - 使用不同的服务器验证 token ?

转载 作者:行者123 更新时间:2023-12-04 13:47:59 31 4
gpt4 key购买 nike

我正在使用 IdentityServer4 来保护一些 webapis。由于我们的客户设置中的一个怪癖,我们需要支持一个设置,其中我们将有多个应用程序运行 IdentityServer4 以向不同的客户端颁发 token 。然而,这些客户端最终会调用一些公共(public)服务。

因此,这些公共(public)服务需要能够验证来自 IdentityServer4 的多个实例的 token 。由于您在启动时向资源服务器注册了 IdentityServer 的实例,我认为只要所有 IdentityServer 都以相同的方式签署 token ,它就会工作。

我假设将 IdentityServer 设置为使用共享 X509 证书将允许在配置为使用不同 IdentityServer 的资源服务器上验证来自一个 IdentityServer 的 token ,但情况似乎并非如此。从 Server1 请求 token ,然后使用 Server2 将其提交给资源服务器不起作用,即使它们都使用相同的证书。

有没有办法使这项工作?

最佳答案

您使用的是 JWT 还是 Reference token ?

引用 token 由持有权限的身份服务器验证。使用不同的身份服务器并验证由另一个身份服务器提供的 token 可能很困难,而不是验证它的人。如果您使用 JWT,您可以使用 Discovery-Endpoint 来捕获公钥。然后你应该能够使用它来验证签名......

你可以这样做:

            // Define the client to access the IdentityServer Discovery-Endpoint
var discos = new DiscoveryClient(ConfigurationManager.AppSettings["IdentityserverLocation"]);
var disco = await discos.GetAsync();

// get the public key from the discovery-endpoint
var keys = disco.KeySet.Keys;

//Build the authorization request
//param: Disco.AuthorizeEndpoint --> retrieves the authorization url from the identityserver
var request = new AuthorizeRequest(disco.AuthorizeEndpoint);
var url = request.CreateAuthorizeUrl(
clientId: ConfigurationManager.AppSettings["ClientId"],
responseType: "id_token",
scope: "openid profile email",
responseMode: OidcConstants.ResponseModes.FormPost,
redirectUri: ConfigurationManager.AppSettings["RedirectUrl"],
state: CryptoRandom.CreateUniqueId(),
nonce: CryptoRandom.CreateUniqueId());

//Try to initiate validation
try
{

// Check if the token data exists in the request, parse is to a correct token
var idToken = Request.Form.Get("id_token");
JwtSecurityToken j = new JwtSecurityToken(idToken);
var keylist = new List<SecurityKey>();
foreach (var webKey in disco.KeySet.Keys)
{
var exp = Base64Url.Decode(webKey.E);
var mod = Base64Url.Decode(webKey.N);
var key = new RsaSecurityKey(new RSAParameters() { Modulus = mod, Exponent = exp });
keylist.Add(key);
}

//define the parameters for validation of the token
var parameters = new TokenValidationParameters
{
ValidIssuer = disco.Issuer,
ValidAudience = "viper",
IssuerSigningKeys = keylist,
};

var handler = new JwtSecurityTokenHandler();
handler.InboundClaimTypeMap.Clear();

//validate the token using the defined parameters, return the token when validation is succesful
var user = handler.ValidateToken(j.RawData, parameters, out var validatedtoken);

关于c# - 使用不同的服务器验证 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42255422/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com