ClaimActions.Remove 和 ClaimActions.DeleteClaim 之间的区别
Difference between ClaimActions.Remove and ClaimActions.DeleteClaim
我正在努力学习 OAuth2 和 IdentityServer4。
我想知道Microsoft.AspNetCore.Authentication.OAuth.Claims
中ClaimActions.Remove
和ClaimActions.DeleteClaim
的区别
我正在尝试遵循 Microsoft
上的一些教程和文档
在我的代码中,我做了类似这样的测试:
options.ClaimActions.Remove("amr");
options.ClaimActions.DeleteClaim("sid");
options.ClaimActions.DeleteClaim("idp");
但是,我在解密JwtToken时仍然可以看到这三个。
我的 JwtToken 示例:
{
"nbf": 1568057488,
"exp": 1568061088,
"iss": "https://localhost:44378",
"aud": "https://localhost:44378/resources",
"client_id": "oauthtestwebclient",
"sub": "78452916-D260-4219-927C-954F4E987E70",
"auth_time": 1568057485,
"idp": "local",
"scope": [
"openid",
"profile",
"address"
],
"amr": [
"pwd"
]
}
所以,我不明白为什么它不从生成的 JwtToken 中删除这些声明
我想知道这两种方法的区别和用例。你能帮我解释一下吗?
声明操作允许修改来自外部提供者的声明如何映射(或不映射)到您的 ClaimsPrincipal 中的声明。这不会影响您的 jwt 令牌声明。
让我们从默认的 ASP.NET 核心 OIDC 中间件开始:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
});
默认情况下,ASP.NET 核心 OIDC 中间件将忽略一些不会映射到用户声明的声明,请参阅 source code:
ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
ClaimActions.DeleteClaim("iss");
ClaimActions.DeleteClaim("iat");
ClaimActions.DeleteClaim("nbf");
ClaimActions.DeleteClaim("exp");
ClaimActions.DeleteClaim("at_hash");
ClaimActions.DeleteClaim("c_hash");
ClaimActions.DeleteClaim("ipaddr");
ClaimActions.DeleteClaim("platf");
ClaimActions.DeleteClaim("ver");
因此,即使 Jwt 令牌包含上述声明,在身份验证后,用户声明也不会包含上述声明,因为它们在映射时会被忽略。
如果使用 options.ClaimActions.Remove("amr");
,这意味着 amr
将映射到用户 claimsprincipal 。
如果使用 ClaimActions.DeleteClaim("sid");
,这意味着 sid
不会映射到用户声明。
因此,如果使用您的测试选项,结果将是:
我正在努力学习 OAuth2 和 IdentityServer4。
我想知道Microsoft.AspNetCore.Authentication.OAuth.Claims
中ClaimActions.Remove
和ClaimActions.DeleteClaim
的区别
我正在尝试遵循 Microsoft
上的一些教程和文档在我的代码中,我做了类似这样的测试:
options.ClaimActions.Remove("amr");
options.ClaimActions.DeleteClaim("sid");
options.ClaimActions.DeleteClaim("idp");
但是,我在解密JwtToken时仍然可以看到这三个。
我的 JwtToken 示例:
{
"nbf": 1568057488,
"exp": 1568061088,
"iss": "https://localhost:44378",
"aud": "https://localhost:44378/resources",
"client_id": "oauthtestwebclient",
"sub": "78452916-D260-4219-927C-954F4E987E70",
"auth_time": 1568057485,
"idp": "local",
"scope": [
"openid",
"profile",
"address"
],
"amr": [
"pwd"
]
}
所以,我不明白为什么它不从生成的 JwtToken 中删除这些声明
我想知道这两种方法的区别和用例。你能帮我解释一下吗?
声明操作允许修改来自外部提供者的声明如何映射(或不映射)到您的 ClaimsPrincipal 中的声明。这不会影响您的 jwt 令牌声明。
让我们从默认的 ASP.NET 核心 OIDC 中间件开始:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
});
默认情况下,ASP.NET 核心 OIDC 中间件将忽略一些不会映射到用户声明的声明,请参阅 source code:
ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
ClaimActions.DeleteClaim("iss");
ClaimActions.DeleteClaim("iat");
ClaimActions.DeleteClaim("nbf");
ClaimActions.DeleteClaim("exp");
ClaimActions.DeleteClaim("at_hash");
ClaimActions.DeleteClaim("c_hash");
ClaimActions.DeleteClaim("ipaddr");
ClaimActions.DeleteClaim("platf");
ClaimActions.DeleteClaim("ver");
因此,即使 Jwt 令牌包含上述声明,在身份验证后,用户声明也不会包含上述声明,因为它们在映射时会被忽略。
如果使用 options.ClaimActions.Remove("amr");
,这意味着 amr
将映射到用户 claimsprincipal 。
如果使用 ClaimActions.DeleteClaim("sid");
,这意味着 sid
不会映射到用户声明。
因此,如果使用您的测试选项,结果将是: