我正在使用Asp.Net 5 MVC,Owin和Oauth2 bearer token作为auth类型开发一个Web应用程序。
在this guide添加了一个自定义复杂声明Json序列化到Microsoft.IdentityModel.Claims.ClaimsIdentity
的实例并成功后,我尝试使用ClaimsIdentity上的{{3}}复制相同的示例{1}}命名空间。
不幸的是,似乎向System.Security.Claims
实例添加complexClaim
,派生的类类型信息将丢失,并且声明存储为ClaimsIdentity
。
System.Security.Claims.Claim
当我尝试从身份中取回声明时,将其转换为var complexClaim = new ComplexClaim<UKPassport>(@"http://it.test/currentpassport", passport);
var claims = new List<Claim>() { complexClaim };
identity.AddClaims(claims);
类型会产生空值。
ComplexClaim<UKPassport>
使用var passportClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == @"http://it.test/currentpassport") as ComplexClaim<UKPassport>;
完全相同的示例。
任何提示?
以下是完整的移植代码:
Microsoft.IdentityModel.Claims
答案 0 :(得分:9)
这不受支持也不建议 - 声明是键/值对 - 保持它们尽可能简单。
.NET中有许多支持类无法处理您要实现的目标(SAM,CookieMiddleware等)。
另见这里 http://leastprivilege.com/2012/10/08/custom-claims-principals-in-net-4-5/
答案 1 :(得分:2)
GetPassport
中的强制转换尝试从基类型Claim
转换为派生类型ComplexClaim<UKPassport>
,这将导致null。
您需要编写一个强制转换运算符,以便从Claim
转换为UKPassport
public static explicit operator UKPassport(Claim c)
{
return (c == null ? null:JsonConvert.DeserializeObject<UKPassport> (c.Value));
}
和GetPassport
将是
private static UKPassport GetPassport(this ClaimsIdentity identity, string passportType)
{
return (UKPassport)identity.Claims.FirstOrDefault<Claim>(c => c.Type == @"http://it.test/currentpassport");
}