ClaimActions.Remove 和 ClaimActions.DeleteClaim 之间的区别

Difference between ClaimActions.Remove and ClaimActions.DeleteClaim

我正在努力学习 OAuth2 和 IdentityServer4。

我想知道Microsoft.AspNetCore.Authentication.OAuth.Claims

ClaimActions.RemoveClaimActions.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 不会映射到用户声明。

因此,如果使用您的测试选项,结果将是: