Pergunta

Estou implementando o novo ASP.NET Identity 2.0 Framework em um site existente que usa o Identity Minder da CA, que usa principalmente Request.ServerVariables para alimentar todos os controles.

O que estou tentando fazer é preencher os cabeçalhos de solicitação com as mesmas variáveis ​​que a CA faz em cada solicitação no evento BeginRequest com um manipulador HTTP, mas usando o novo provedor de identidade.

Eu sei que no evento BeginRequest tenho acesso para ler cookies do cliente e sei que posso verificar se o cookie OWIN está lá (chamado .AspNet.ApplicationCookie), mas não sei como posso descriptografar o cookie para tire as reivindicações disso.

Eu também tentei fazer isso para ler as reivindicações:

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

Quando faço isso, no entanto, não recebo nada pelo valor, então presumo que Thread.CurrentPrincipal não esteja preenchido tão cedo no pipeline de solicitação.

Este código funciona, no entanto

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

Portanto, considerando que TENHO acesso ao cookie, gostaria de saber se havia alguma maneira de descriptografá-lo para poder ler as declarações que defini dentro dele.

Aqui está como estou definindo minhas reivindicações na página de login:

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)
Foi útil?

Solução

Você não precisa descriptografar o cookie sozinho.Você só precisa verificar se o usuário está autorizado e obter as reivindicações existentes.

Por favor, tente algo assim:

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top