我应该如何/应该坚持一个ClaimsPrincipal?

时间:2014-08-06 11:14:28

标签: asp.net forms-authentication wif claims-based-identity

我刚看了Introduction to Identity and Access Control in .NET 4.5 video on Pluralsight。我试图从这个转换旧的webforms应用程序(不是MVC而不是OWIN)...

Dim authTicket As New FormsAuthenticationTicket(1, "Bob", DateTime.UtcNow.ToLocalTime(), DateTime.UtcNow.ToLocalTime.AddMinutes(60), False, "Master")
Dim authCookie As New HttpCookie("MyApp", FormsAuthentication.Encrypt(authTicket))

...以ClaimsIdentity和基于声明的方法。虽然视频中涵盖了ClaimsIdentity及其声明,但几乎没有提及如何将它们全部插入并在页面上保留用户(之前已自动完成的内容)。

例如,这是设置用户声明的有效替代方法吗?

Dim fd As New FormsIdentity(New FormsAuthenticationTicket("MyApp", True, 60))
fd.AddClaims(New List(Of Claim) From {
 New Claim(ClaimTypes.Name, "Bob"),
    New Claim(ClaimTypes.Role, "Master")
})
Dim p As New ClaimsPrincipal(fd)

如果是这样,那么ClaimsPrincipal如何在后续页面中存储/保存/检索? 目前我没有使用OWIN,但如果有利于这种情况可以引入它。

1 个答案:

答案 0 :(得分:1)

AFAIK A ClaimsPrincipal在"序列化"时始终转换为某种SecurityToken。如果它是由STS发送的,则它是SAML或JWT安全令牌。如果在会话期间记住,那么它是SessionSecurityToken。这些令牌中的每一个都有相应的SecurityTokenHandler类。

在经典的ASP.NET / MVC中,您有两个http模块:WSFederationAuthenticationModuleSessionAuthenticationModule。后者确保ClaimsPrincipal存储在会话中。默认情况下,WIF使用SessionSecurityTokenHandler并将ClaimsPrincipal存储在一堆Cookie中。

一旦您知道序列化ClaimsPrincipal的路径超过SecurityToken,您的问题就会变得更容易了。首先将其转换为SecurityToken,然后使用处理程序将其转换为字符串"。

对于你来说,归结为实例化正确的SecurityTokenHandler衍生物。要反序列化它,只需调用ValidateToken(这是一个很好的方法名称来反序列化一个令牌)。这会为您提供一个声明列表,可以使用ClaimsIdentityClaimsPrincipal轻松转换。

要对其进行序列化,您可能必须通过SecurityTokenDescriptor(您提出申诉的地方)将ClaimsPrincipal转换为SecurityToken,然后转换为SecurityTokenHandler可以将其转换为"字符串"。