Onde é que Web.HttpContext.Current.User.Identity.Name vem?
-
16-09-2019 - |
Pergunta
Eu tenho
FormsAuthentication.SetAuthCookie("someName", True)
como parte do meu seqüência de login personalizado. Mais tarde, eu tenho alguma página só permitindo um papel específico:
<location path="myPage.aspx">
<system.web>
<authorization>
<allow roles="SomeRole"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Tanto quanto eu posso dizer, que faz uma chamada para a implementação do meu provedor de função de GetRolesForUser. Parece para obter o parâmetro nome de usuário de Web.HttpContext.Current.User.Identity.Name.
A minha pergunta é .... quando é que o nome de usuário do conjunto get cookie de autenticação como o nome na minha identidade do usuário atual?
Solução
O nome de usuário é apenas uma propriedade do objeto de usuário IPrinciple e esse objeto é definido em um dos o padrão ASP.NET httpModules, no seu caso, provavelmente System.Web.Security.FormsAuthenticationModule como parte do método OnAuthenticate.
Se o que você quer saber é como mudar esta informação, como a definição de um nome de usuário ou identidade diferente, você vai querer olhar para a criação de um global.asax ou um HTTPModule personalizado que substitui o Application_AuthenticateRequest. Aqui está um exemplo:
Public Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Dim cookieName As String = FormsAuthentication.FormsCookieName
Dim authCookie As HttpCookie = HttpContext.Current.Request.Cookies(FormsAuthentication.FormsCookieName)
If Not IsNothing(authCookie) Then
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
If IsNothing(authTicket) OrElse authTicket.Expired Then
HttpContext.Current.Response.Redirect(FormsAuthentication.LoginUrl)
Else
Dim id As New FormsIdentity(authTicket)
Dim newUser As New YourCustomUserType(id.Name)
HttpContext.Current.User = newUser
End If
End If
End Sub
Outras dicas
parece que pode ocorrer no OnAuthenticate método privado em System.Web.Security.FormsAuthenticationModule. A linha é
e.Context.SetPrincipalNoDemand(
new GenericPrincipal(new FormsIdentity(ticket),
new string[0]));