我可以获取OWIN cookie并解密它以在BeginRequest中获取它的声明吗?

vip*_*srz 7 asp.net cookies httpmodule owin asp.net-identity

我在现有网站中实现新的ASP.NET Identity 2.0 Framework使用CA的Identity Minder,它主要使用Request.ServerVariables为所有控件供电.

我要做的是使用与HTTP处理程序在BeginRequest事件中的每个请求上使用CA执行的相同变量填充请求标头,但使用新的标识提供程序.

我知道在BeginRequest事件中我有权从客户端读取cookie,我知道我可以检查OWIN cookie是否存在(名为.AspNet.ApplicationCookie),但我不知道如何解密cookie到从中得到索赔.

我也试过这样做来阅读声明:

Dim identity = CType(Thread.CurrentPrincipal, ClaimsPrincipal)
Dim claim = identity.Claims.SingleOrDefault(Function(c) c.Type = ClaimTypes.Name)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我得不到任何值,所以我假设在请求管道的早期没有填充Thread.CurrentPrincipal.

但是,此代码确实有效

Dim application As HttpApplication = DirectCast(sender, HttpApplication)
Dim cookie = application.Context.Request.Cookies(".AspNet.ApplicationCookie")
If cookie Is Nothing Then
    HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "NOT Logged in")
Else
    HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "Logged in")
End If
Run Code Online (Sandbox Code Playgroud)

因此,考虑到我可以访问cookie,我想知道是否有任何方法可以解密它,以便我可以阅读我在其中设置的声明.

以下是我在登录页面上设置声明的方式:

Dim claims = New List(Of Claim)()
claims.Add(New Claim(ClaimTypes.Name, user.UserName))
claims.Add(New Claim(ClaimTypes.Email, user.Email))
Dim id = New ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie)
authenticationManager.SignIn(id)
Run Code Online (Sandbox Code Playgroud)

Yur*_* A. 3

您不需要自己解密 cookie。您只需要检查用户是否获得授权并获取现有的声明。

请尝试这样的事情:

var claimsIdentity = User.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
    Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
    if (providerKeyClaim != null)
    {
        var name = claimsIdentity.FindFirstValue(ClaimTypes.Name);
        var email = claimsIdentity.FindFirstValue(ClaimTypes.Email);
    }
}
Run Code Online (Sandbox Code Playgroud)