我刚看了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,但如果有利于这种情况可以引入它。
答案 0 :(得分:1)
AFAIK A ClaimsPrincipal
在"序列化"时始终转换为某种SecurityToken。如果它是由STS发送的,则它是SAML或JWT安全令牌。如果在会话期间记住,那么它是SessionSecurityToken
。这些令牌中的每一个都有相应的SecurityTokenHandler
类。
在经典的ASP.NET / MVC中,您有两个http模块:WSFederationAuthenticationModule
和SessionAuthenticationModule
。后者确保ClaimsPrincipal
存储在会话中。默认情况下,WIF使用SessionSecurityTokenHandler
并将ClaimsPrincipal
存储在一堆Cookie中。
一旦您知道序列化ClaimsPrincipal
的路径超过SecurityToken
,您的问题就会变得更容易了。首先将其转换为SecurityToken
,然后使用处理程序将其转换为字符串"。
对于你来说,归结为实例化正确的SecurityTokenHandler
衍生物。要反序列化它,只需调用ValidateToken
(这是一个很好的方法名称来反序列化一个令牌)。这会为您提供一个声明列表,可以使用ClaimsIdentity
和ClaimsPrincipal
轻松转换。
要对其进行序列化,您可能必须通过SecurityTokenDescriptor
(您提出申诉的地方)将ClaimsPrincipal
转换为SecurityToken
,然后转换为SecurityTokenHandler
可以将其转换为"字符串"。