获取简短的声明类型名称

时间:2016-03-30 17:18:10

标签: asp.net-core asp.net-identity asp.net-identity-3

我正在使用Asp.Net Core和ASP.NET Identity,当我收到Claim类型时,我会得到类似

的内容
"type":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
"value":"123"

如何只获取简单的类型名称,例如:

"type":"nameidentifier",
"value":"123"

我知道这是可能的,我无法找到解决方案。

6 个答案:

答案 0 :(得分:8)

当我遇到this documentation时,我正在寻找这个答案:

  

当您检查about页面上的声明时,您会注意到两件事:一些声明具有奇怪的长类型名称,并且声明的声明比您在应用程序中可能需要的声明多。

     

长索赔名称来自Microsoft的JWT处理程序,试图将一些声明类型映射到.NET的ClaimTypes类类型。您可以使用以下代码行(在Startup中)关闭此行为。

     

这也意味着您需要将反CSRF保护的配置调整为新的唯一子声明类型:

AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject;
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

我将此代码添加到了我的客户端的Startup.cs,并缩短了声明类型。

<强>更新

对于较新版本的IdentityModel,该属性称为DefaultInboundClaimTypeMap

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

确保在设置身份配置之前运行此行

答案 1 :(得分:1)

如果您想获取nameidentifier值,请输入代码:

User.FindFirst(ClaimTypes.NameIdentifier).Value

答案 2 :(得分:1)

System.IO.Path.GetFileName(claim.Type)

答案 3 :(得分:0)

试试这个

public static class ClaimsPrincipalExtentions
{

    private const string ShortNameProperty = "http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/ShortTypeName";

    public static IEnumerable<Claim> GetClaimsByShortTypeName(this ClaimsPrincipal cp, string name)
    {
        return cp.Claims.Where(x => x.GetShortTypeName() == name);
    }

    public static string GetShortTypeName(this Claim claim)
    {
        string shortName;
        return claim.Properties.TryGetValue(ShortNameProperty, out shortName) ? shortName : claim.Type;
    }

}

答案 4 :(得分:0)

using System.IdentityModel.Tokens.Jwt;

var claim = new Claim(ClaimTypes.NameIdentifier, "1");
if (JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.TryGetValue(claim.Type, out string type))
{
    var shotrClame = new Claim(type, claim.Value, claim.ValueType, claim.Issuer, claim.OriginalIssuer, claim.Subject);
}

var claim = new Claim("nameid", "1");
if (JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.TryGetValue(claim.Type, out string type))
{
    var longClameType = new Claim(type, claim.Value, claim.ValueType, claim.Issuer, claim.OriginalIssuer, claim.Subject);
}

来源:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/d2361e5dcd1abbf6d0ea441cdb2e7404166b122c/src/System.IdentityModel.Tokens.Jwt/ClaimTypeMapping.cs#L61

答案 5 :(得分:0)

我想使用短名称进行日志记录,所以我使用了这个:

var name = JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.FirstOrDefault(x => x.Value == myclaim.Type).Key ?? c.Type;

它可能不是最初在 JWT 中发送的内容(例如,“sub”可能会变成“nameid”),但它确实提供了比“http://schemas.xmlsoap.org/ws/2005 /05/identity/claims/nameidentifier”。