首页 > 解决方案 > ClaimActions.Remove 和 ClaimActions.DeleteClaim 之间的区别

问题描述

我正在尝试学习 OAuth2 和 IdentityServer4。

我想知道Microsoft.AspNetCore.Authentication.OAuth.ClaimsClaimActions.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 中删除这些声明

我想知道这两种方法的区别和用例。你能帮我解释一下吗?

标签: asp.net-coreoauthidentityserver4claims

解决方案


声明操作允许修改来自外部提供者的声明如何映射(或不映射)到您的 ClaimsPrincipal 中的声明。这不会影响您的 jwt 令牌声明。

让我们从默认的 ASP.NET Core OIDC middeware 开始:

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 Core OIDC middeware 将忽略一些不会映射到用户声明的声明,请参阅源代码

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将映射到用户声明主体。

如果使用ClaimActions.DeleteClaim("sid");,则意味着sid不会映射到用户声明。

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

![在此处输入图像描述


推荐阅读