gpt4 book ai didi

c# - 使用公钥/私钥而不是共享 key 的 IdentityServer 客户端身份验证

转载 作者:太空狗 更新时间:2023-10-29 17:45:45 27 4
gpt4 key购买 nike

我正在尝试使用公钥/私钥而不是 IdentityServer4 的客户端 key 的共享 key 。此方法记录在案 here .

如果它是共享 secret ,请求将包含纯文本形式的 secret。例如

curl -X POST \
http://<identityserver>/connect/token \
-F client_id=abc \
-F client_secret=secret \
-F grant_type=client_credentials \
-F scope=api1 api2

我的问题是:使用公钥/私钥身份验证方法应该将什么作为secret传递?

为了提供一些背景知识,使用公钥/ key 身份验证的客户端将通过以下步骤向 IdentityServer 注册

  1. 客户端生成一个.crt文件例如

    // create key
    $ openssl genrsa -des3 -passout pass:x -out client.pass.key 2048
    $ openssl rsa -passin pass:x -in client.pass.key -out client.key

    // create certificate request (csr)
    $ openssl req -new -key client.key -out client.csr

    // create certificate (crt)
    $ openssl x509 -req -sha256 -days 365 -in client.csr -signkey client.key -out client.crt

    // export pfx file from key and crt
    $ openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
  2. 客户端将client.crt文件共享给IdentityServer

  3. IdentityServer 将通过以下方式注册客户端

    var client = new Client
    {
    ClientId = "abc",
    ClientSecrets =
    {
    new Secret
    {
    Type = IdentityServerConstants.SecretTypes.X509CertificateBase64,
    Value = "MIIDF...." <================= contents of the crt file
    }
    },

    AllowedGrantTypes = GrantTypes.ClientCredentials,
    AllowedScopes = { "api1", "api2" }
    };

最佳答案

感谢 IdentityServer4 中的单元测试!

使用公共(public)/私有(private)身份验证时,不使用client_secret。相反,使用了 client_assertion,这是一个 JWT token 。

这是 token 请求的示例代码。 client.pfx 是问题中上述步骤生成的证书包。

var now = DateTime.UtcNow;
var clientId = "abc";
var tokenEndpoint = "http://localhost:5000/connect/token";

var cert = new X509Certificate2("client.pfx", "1234");

// create client_assertion JWT token
var token = new JwtSecurityToken(
clientId,
tokenEndpoint,
new List<Claim>
{
new Claim("jti", Guid.NewGuid().ToString()),
new Claim(JwtClaimTypes.Subject, clientId),
new Claim(JwtClaimTypes.IssuedAt, now.ToEpochTime().ToString(), ClaimValueTypes.Integer64)
},
now,
now.AddMinutes(1),
new SigningCredentials(
new X509SecurityKey(cert),
SecurityAlgorithms.RsaSha256
)
);

var tokenHandler = new JwtSecurityTokenHandler();
var tokenString = tokenHandler.WriteToken(token);


// token request - note there's no client_secret but a client_assertion which contains the token above
var requestBody = new FormUrlEncodedContent(new Dictionary<string, string>
{
{"client_id", clientId},
{"client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"},
{"client_assertion", tokenString},
{"grant_type", "client_credentials"},
{"scope", "api1 api2"}
});


var client = new HttpClient();
var response = await client.PostAsync(tokenEndpoint, requestBody);
var tokenRespone = new TokenResponse(await response.Content.ReadAsStringAsync());

关于c# - 使用公钥/私钥而不是共享 key 的 IdentityServer 客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49686262/

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