Posso obter o cookie OWIN e descriptografá-lo para obter declarações dele em BeginRequest?
-
21-12-2019 - |
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)
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);
}
}