Сохранение списка строк в Claim (System.Security.Claims)
Я разрабатываю веб-приложение с маркером-носителем Asp.Net 5 MVC, Owin и Oauth2 как тип auth.
Мне нужно сохранить список строк "CODEFOO,CODBAR,CODEX,.."
внутри System.Security.Claims.Claim с пользовательским типом претензии.
Когда пользователь запрашивает токен, этот список "кодов пользователей" получается из внутреннего блока и устанавливается внутри идентификатора с использованием определенного типа пользовательских требований.
Когда пользователь отправляет токен назад, перемещаясь по определенному действию MVC, приложение должно проверить, содержит ли список кодов пользователя внутри претензии, определенный код.
List<string> userCodes = rep.GetUserCodeFromBackEnd();
string userCodesClaimType = "http://foo.it/claim/usercodesclaimtype";
Сейчас я сериализую список строк в JSON.
var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes));
и верните его, дерициализируя его примерно так:
var userCodesClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == userCodesClaimType) ;
var userCodesClaimValue = JsonConvert.DeserializeObject<List<string>>(userCodesClaim.Value);
Теперь вопрос:
есть ли лучший способ сохранить список значений внутри претензии?
Требование имеет свойство ValueType, в документации которого говорится:
Свойство ValueType содержит строку, которая идентифицирует тип информация о стоимости. Это свойство можно использовать для понимания формат значения и предоставить информацию о том, как сериализовать и десериализовать значение. Если ваше решение требует сложной ценности типов, рекомендуется использовать стандартные типы схем XML в ValueType, чтобы указать, как должно выглядеть свойство Value сериализован и десериализован из строки.
К несчастью, я не нашел никакого примера, который документирует использование этого свойства.
Является ли сериализация Json в порядке или я должен использовать подход ValueType?
Ответы
Ответ 1
ValueType
- это способ для вашего кода определить, как значение должно интерпретироваться/десериализоваться, например, содержать тип схемы XML. Если использовать код из разных источников, это имеет смысл, но в вашем собственном приложении вы можете просто игнорировать его, если знаете, как интерпретировать содержимое.
Но чтобы иметь несколько значений, вам не нужно будет использовать сложные типы. Идентификатор претензий может иметь несколько претензий с тем же ClaimType
, поэтому вместо сериализации кодов в строку JSon вы должны просто добавить несколько заявок; по одному для каждого кода пользователя. Все они имеют одинаковый тип претензии. Это позволит использовать метод HasClaim
для проверки наличия конкретного кода пользователя.
Ответ 2
Придерживайтесь JSON или используйте многозначную претензию (многозначный атрибут в терминах LDAP).
Не путайте System.Security.Claims.Claim.Type и Claim.ValueType.
Тип - это "Имя заявки" (имя атрибута в разговоре LDAP). См. System.Security.Claims.ClaimTypes для образца uris.
ValueType предназначен для сериализации XML. См. System.Security.Claims.ClaimValueTypes для образца uris.
Вы думали о том, чтобы использовать ValueType для правильной сериализации. Это не совсем невозможно, вам нужно запрограммировать его самостоятельно. Я боюсь, что не так много других, которые могут справиться с этим (в токене SAML). Так что не надо, если только они не держат на себе пистолет. Доминик также предупредил вас.
Вам нужно будет написать несколько вещей: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims
Это было для WIF 3.5, но принцип тот же, что и в .NET 4.5.