Как / Должен ли я сохранить ClaimsPrincipal?

Я только что посмотрел видео Введение в управление идентификацией и доступом в.NET 4.5 на Pluralsight. Я пытаюсь преобразовать старое приложение webforms (не MVC и не OWIN) из этого...

Dim authTicket As New FormsAuthenticationTicket(1, "Bob", DateTime.UtcNow.ToLocalTime(), DateTime.UtcNow.ToLocalTime.AddMinutes(60), False, "Master")
Dim authCookie As New HttpCookie("MyApp", FormsAuthentication.Encrypt(authTicket))

... в ClaimsIdentity и основанный на требованиях подход. Хотя ClaimsIdentity и его претензии описаны в видео, там мало упоминаний о том, как соединить все это вместе и сохранить пользователя на разных страницах (то, что раньше делалось автоматически).

Например, является ли это действительной альтернативой вышеприведенному для настройки утверждений пользователя?

Dim fd As New FormsIdentity(New FormsAuthenticationTicket("MyApp", True, 60))
fd.AddClaims(New List(Of Claim) From {
 New Claim(ClaimTypes.Name, "Bob"),
    New Claim(ClaimTypes.Role, "Master")
})
Dim p As New ClaimsPrincipal(fd)

Если так, то как ClaimsPrincipal затем сохранены / сохранены / получены на последующих страницах? В настоящее время я не использую OWIN, но могу представить его, если это пойдет на пользу этому сценарию.

1 ответ

Решение

AFAIK A ClaimsPrincipal всегда преобразуется в какой-то тип SecurityToken при "сериализации". Если он отправлен службой STS, это маркер безопасности SAML или JWT. Если это запоминается во время сеанса, то это SessionSecurityToken, Каждый из этих токенов имеет соответствующий SecurityTokenHandler учебный класс.

В классическом ASP.NET/MVC у вас есть два http-модуля: WSFederationAuthenticationModule а также SessionAuthenticationModule, Последний гарантирует, что ClaimsPrincipal хранится в течение сеанса. По умолчанию WIF использует SessionSecurityTokenHandler и хранит ClaimsPrincipal в кучу печенья.

Таким образом, ваш вопрос становится легче, когда вы знаете, что путь к сериализации ClaimsPrincipal проходит через SecurityToken, Вы сначала конвертируете его в SecurityToken а затем использовать обработчик для "преобразования его в строку".

Для вас это сводится к созданию правильного SecurityTokenHandler производный. Чтобы десериализовать это, просто позвоните ValidateToken (это отличное имя метода для десериализации токена). Это дает вам список претензий, которые могут быть легко преобразованы в ClaimsIdentity и ClaimsPrincipal,

Чтобы сериализовать его, вам, возможно, придется пройти через SecurityTokenDescriptor (где вы положили свои претензии), чтобы конвертировать ваши ClaimsPrincipal в SecurityTokenтогда SecurityTokenHandler может преобразовать это в "строку".

Другие вопросы по тегам