.NET Framework中的复杂声明值与System.Security.Claims

时间:2014-07-17 21:18:30

标签: c# asp.net-mvc-5 wif owin claims-based-identity

我正在使用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

2 个答案:

答案 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");
}