我正在使用Asp.Net Core和ASP.NET Identity,当我收到Claim类型时,我会得到类似
的内容"type":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
"value":"123"
如何只获取简单的类型名称,例如:
"type":"nameidentifier",
"value":"123"
我知道这是可能的,我无法找到解决方案。
答案 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);
}
答案 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”。