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

我正在尝试的是填充具有相同变量的请求标题,即CA在初始查询事件中的每个请求与HTTP处理程序中的每个请求都在,但使用新的身份提供程序。

我知道,在初始化事件中,我可以访问客户端阅读cookie,我知道我可以检查owin cookie是否存在(名为.aspnet.applicationscookie),但我不知道我如何解密饼干从中获得索赔。

我还尝试这样做以阅读权利要求:

Dim identity = CType(Thread.CurrentPrincipal, ClaimsPrincipal)
Dim claim = identity.Claims.SingleOrDefault(Function(c) c.Type = ClaimTypes.Name)
.

当我这样做时,我对该值没有任何东西,所以我假设线程.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
. 所以考虑到我确实可以访问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)
.

有帮助吗?

解决方案

您不需要自行解密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);
    }
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top