NameClaimType в ClaimsIdentity из SAML

Я пытаюсь понять мир WIF в контексте сервера WCF Data Service/REST/OData. У меня есть взломанная версия SelfSTS, которая работает внутри проекта модульного тестирования. Когда начинаются модульные тесты, он запускает службу WCF, которая генерирует мой токен SAML. Создается токен SAML:

<saml:Assertion MajorVersion="1" MinorVersion="1" ... >
  <saml:Conditions>...</saml:Conditions>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:NameIdentifier Format="EMAIL">4bd406bf-0cf0-4dc4-8e49-57336a479ad2</saml:NameIdentifier>
      <saml:SubjectConfirmation>...</saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Attribute AttributeName="emailaddress" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
      <saml:AttributeValue>[email protected]</saml:AttributeValue>
    </saml:Attribute>
    <saml:Attribute AttributeName="name" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
      <saml:AttributeValue>bob</saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
  <ds:Signature>...</ds:Signature>
</saml:Assertion>

(Я знаю, что формат моего NameIdentifier на самом деле не EMAIL, это то, что я еще не убрал.)

Внутри моего реального сервера я разместил несколько код позаимствован у Пабло Кабраро / Cibrax. Этот код, кажется, работает A-OK, хотя я признаюсь, что не понимаю, что происходит. Я отмечаю, что позже в моем коде, когда мне нужно проверить свою личность, Thread.CurrentPrincipal.Identity является экземпляром Microsoft.IdentityModel.Claims.ClaimsIdentity, у которого есть утверждение для всех атрибутов, а также утверждение nameidentifier со значением в моем элементе NameIdentifier в saml:Subject. У него также есть свойство NameClaimType, указывающее на "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name". Было бы больше смысла, если бы NameClaimType сопоставлялся с nameidentifier, не так ли? Как мне это сделать? Или я ожидаю неправильного утверждения имени?

Спасибо!


person object88    schedule 24.08.2012    source источник


Ответы (1)


Значение NameClaimType можно указать в файле Web.config, что позволяет сделать его наиболее подходящим для использования в качестве IIdentity.Name.

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsidentity.nameclaimtype.aspx говорит

Свойство NameClaimType указывает тип утверждения (Claim.Type), который используется для предоставления имени для этого удостоверения. Доступ к имени осуществляется через свойство Name.

И http://msdn.microsoft.com/en-us/library/ee517298.aspx указывает

ClaimsIdentity.NameClaimType. Свойство NameClaimType предназначено для использования на принимающей стороне для выбора значения утверждения, используемого для IIdentity.Name.

Другими словами, он позволяет свойству Name представлять то, что имеет наибольший смысл в данной ситуации — часто это может быть тип утверждения nameidentifier, хотя в вашем случае оно установлено как имя.

person Alex A.    schedule 28.08.2012
comment
Итак, в итоге я реализовал собственный обработчик токенов на основе класса Saml11SecurityTokenHandler и перегрузил метод ProcessSamlSubject, чтобы вручную установить NameClaimType субъекта. Я предполагаю, что мне нужно будет переопределить это по-разному для разных обработчиков токенов и, возможно, по-разному для разных IP-адресов. Спасибо за помощь! - person object88; 01.09.2012