Asp.net core 索赔之间的差异。删除和索赔。删除索赔

Asp.net core 索赔之间的差异。删除和索赔。删除索赔,asp.net-core,oauth,identityserver4,claims,Asp.net Core,Oauth,Identityserver4,Claims,我正在尝试学习OAuth2和IdentityServer4 我想知道Microsoft.AspNetCore.Authentication.OAuth.Claims中索赔。删除和索赔。删除索赔之间的区别 我正在尝试学习一些有关的教程和文档 在我的代码中,我做了如下测试: options.ClaimActions.Remove("amr"); options.ClaimActions.DeleteClaim("sid"); options.ClaimActions.DeleteClaim("id

我正在尝试学习OAuth2和IdentityServer4

我想知道Microsoft.AspNetCore.Authentication.OAuth.Claims中
索赔。删除
索赔。删除索赔
之间的区别

我正在尝试学习一些有关的教程和文档

在我的代码中,我做了如下测试:

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

所以,即使Jwt令牌也包含上述声明,在身份验证之后,用户声明将不包含上述声明,因为在映射时它们会被忽略

如果使用选项。索赔。删除(“amr”)
,这意味着
amr
将映射到用户索赔

如果使用
索赔。删除索赔(“sid”)
,这意味着
sid
将不会映射到用户声明

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


索赔操作允许修改来自外部提供商的索赔如何映射(或不映射)到您的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 Core OIDC Middware将忽略一些不会映射到用户声明的声明,请参阅:

所以,即使Jwt令牌也包含上述声明,在身份验证之后,用户声明将不包含上述声明,因为在映射时它们会被忽略

如果使用选项。索赔。删除(“amr”)
,这意味着
amr
将映射到用户索赔

如果使用
索赔。删除索赔(“sid”)
,这意味着
sid
将不会映射到用户声明

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


因此,为了确认。。。这两个函数与JwtToken无关。它仅在Controller.User.Claims上下文中操纵UserClaims。我很清楚你的要求。我仍然混淆了
Remove(“amr”)
。移除意味着从哪里移除?从被忽略的列表中?谢谢。是的,该功能用于在客户端应用程序中从identity server获取令牌后映射索赔,从
索赔集合中删除,您可以认为从忽略的列表中,为了确认。。。这两个函数与JwtToken无关。它仅在Controller.User.Claims上下文中操纵UserClaims。我很清楚你的要求。我仍然混淆了
Remove(“amr”)
。移除意味着从哪里移除?从被忽略的列表中?谢谢。是的,该功能用于在客户端应用程序中从identity server获取令牌后映射索赔,从
索赔集合中删除,您可以从忽略列表中考虑