Thread.CurrentPrincipal, заданный в Application_AuthenticationRequest, не задается позже в приложении.
-
03-07-2019 - |
Вопрос
В файле global.asax для Application_AuthenticationRequest я устанавливаю для Thread.CurrentPrincipal пользовательского принципала.Я также установил для HttpContext.Current.User тот же принципал.
Однако позже в приложении, когда мне нужно привести Thread.CurrentPrincipal к нашему пользовательскому типу, я получаю ошибку времени выполнения:Невозможно привести объект типа «System.Web.Security.RolePrincipal» к типу «OurCustomPrincipal».
Как Thread.CurrentPrincipal был сброшен до RolePrincipal, и, более того, как мне сохранить его в CustomPrincipal, который мы установили в global.asax
заранее спасибо
Решение
Вы наверняка уже решили свою проблему, но на всякий случай, если вы используете RoleProvider из ASP.NET, RoleManagerModule перезаписывает объект GenericPrincipal, созданный FormsAuthenticationModule, и заменяет его объектом RolePrincipal во время PostAuthenticateRequest:http://www.asp.net/Learn/Security/tutorial-11-vb.aspx
Другие советы
Подводя итог, можно сказать, что быстрое решение — вместо этого выполнить замену участника и идентификатора в обработчике Application_OnPostAuthenticateRequest.
Убедитесь, что вы реализовали класс для интерфейса IIDentity и Iprincipal, а затем используете что-то вроде следующего кода для назначения текущего принципала.
Dim userIdentity As CustomIdentity
userIdentity = New CustomIdentity(username, True,"forms", sessionId)
Dim principal As New CustomPrincipal(userIdentity, arrRoles)
HttpContext.Current.User = principal
System.Threading.Thread.CurrentPrincipal = principal