Поделиться через


Практическое руководство. Создание службы маркеров безопасности

Служба маркеров безопасности реализует протокол, определенный в спецификации WS-Trust. Данный протокол определяет форматы сообщения и шаблоны обмена сообщениями для выпуска, обновления, отмены и проверки маркеров безопасности. Данная служба маркеров безопасности дает одну или несколько из данных возможностей. В данном разделе рассматривается наиболее общий сценарий: реализация выпуска маркера.

Выпуск маркеров

WS-Trust определяет форматы сообщения на основе элемента схемы RequestSecurityToken языка определения схемы XML (XSD) и элемента схемы XSD RequestSecurityTokenResponse для выпуска маркера. Кроме того, WS-Trust определяет связанные универсальные коды ресурса (URI). URI действия, связанного с сообщением RequestSecurityTokenhttp://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue. URI действия, связанного с сообщением RequestSecurityTokenResponsehttp://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.

Структура сообщения с запросом

Структура сообщения с запросом на выпуск обычно состоит из следующих элементов.

  • URI типа запроса со значением http://schemas.xmlsoap.org/ws/2005/02/trust/Issue.

  • Универсальный код ресурса (URI) типа маркера. Для маркеров разметки утверждений безопасности (SAML) 1.1 это значение равно http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1URI.

  • Значение размера ключа, указывающее количество битов в ключе, связанное с выпущенным маркером.

  • Универсальный код ресурса (URI) типа ключа. Для симметричного ключа значение этого URI равно http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKey.

Кроме того, может присутствовать несколько других элементов.

  • Материал ключа, предоставленный клиентом.

  • Информация об области, показывающая целевую службу, с которой будут использоваться выпущенные маркеры.

При создании ответного сообщения о выпуске служба маркеров безопасности использует информацию письма с запросом на выпуск.

Структура ответного сообщения

Структура ответного сообщения о выпуске обычно состоит из следующих элементов.

  • Выданный маркер безопасности, например, проверочное утверждение SAML 1.1.

  • Маркер проверки, связанный с маркером безопасности. Для симметричных ключей такой маркер часто является зашифрованной формой материала ключа.

  • Ссылки на выпущенный маркер безопасности. Обычно служба маркеров безопасности возвращает ссылку, которая может быть использована при появлении выданного маркера в последующем сообщении, отправленном клиентом, и другую ссылку, которая может быть использована, если маркер не присутствует в последующих сообщениях.

Кроме того, может присутствовать несколько других элементов.

  • Материал ключа, предоставленный службой маркеров безопасности.

  • Алгоритм, необходимый для расчета общего ключа.

  • Сведения о времени существования выпущенного маркера.

Сообщения с запросом на обработку

Служба маркеров безопасности обрабатывает запросы на выпуск, анализируя различные фрагменты сообщения с запросом и проверяя возможность выпуска маркера, соответствующего запросу. Перед созданием выпускаемого маркера служба маркеров безопасности должна определить следующее.

  • Действительно ли запрос является запросом на выпуск маркера.

  • Поддерживает ли служба маркеров безопасности запрошенный тип маркера.

  • Авторизован ли автор заявки на подачу заявки.

  • Может ли служба маркеров безопасности оправдать ожидания автора заявки, относящиеся к материалу ключа.

Две ответственные части создания маркера определяют, каким ключом подписать маркер и при помощи какого ключа зашифровать общий ключ. Ключ должен быть подписан так, чтобы при предоставлении клиентом ключа целевой службе данная служба могла определить, что маркер был выпущен службой безопасности ключей, которой она доверяет. Материал ключа должен быть зашифрован так, чтобы целевая служба могла расшифровать данный материал ключа.

Подписывание утверждения SAML включает создание экземпляра SigningCredentials. Конструктор для данного класса принимает следующее

  • SecurityKey для ключа, который будет использоваться при подписывании утверждения SAML.

  • Строка, определяющая используемый алгоритм подписывания.

  • Строка, определяющая используемый алгоритм хэш-кода.

  • Дополнительно можно указать SecurityKeyIdentifier, определяющий используемый для подписывания утверждения ключ.

void AddSigningCredentials(SamlAssertion assertion, SecurityKey signingKey)
{
    SigningCredentials sc = new SigningCredentials(signingKey,
        SecurityAlgorithms.RsaSha1Signature, SecurityAlgorithms.Sha1Digest);
    assertion.SigningCredentials = sc;
}
Sub AddSigningCredentials(ByVal assertion As SamlAssertion, _
    ByVal signingKey As SecurityKey)
    Dim sc As New SigningCredentials(signingKey, _
    SecurityAlgorithms.RsaSha1Signature, SecurityAlgorithms.Sha1Digest)
    assertion.SigningCredentials = sc

End Sub

Шифрование общего ключа предполагает принятие материала ключа и его шифрование при помощи ключа, который целевая служба сможет использовать для расшифровки общего ключа. Обычно используется открытый ключ целевой службы.

byte[] EncryptKey(byte[] plainTextKey, SecurityKey encryptingKey)
{
    return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey);
}
Function EncryptKey(ByVal plainTextKey() As Byte, _
        ByVal encryptingKey As SecurityKey) As Byte()
    Return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey)
End Function

Кроме того, для зашифрованного ключа необходим идентификатор SecurityKeyIdentifier.

SecurityKeyIdentifier GetKeyIdentifierForEncryptedKey(byte[] encryptedKey,
    SecurityToken encryptingToken)
{
    SecurityKeyIdentifier encryptingKeyIdentifier = new SecurityKeyIdentifier(encryptingToken.CreateKeyIdentifierClause<X509ThumbprintKeyIdentifierClause>());
    return new SecurityKeyIdentifier(new EncryptedKeyIdentifierClause(encryptedKey, SecurityAlgorithms.RsaOaepKeyWrap, encryptingKeyIdentifier));
}
Function GetKeyIdentifierForEncryptedKey(ByVal encryptedKey() _
 As Byte, ByVal encryptingToken As SecurityToken) _
    As SecurityKeyIdentifier
    Dim encryptingKeyIdentifier As New SecurityKeyIdentifier( _
        encryptingToken.CreateKeyIdentifierClause(Of X509ThumbprintKeyIdentifierClause)())
    Return New SecurityKeyIdentifier(New EncryptedKeyIdentifierClause( _
        encryptedKey, SecurityAlgorithms.RsaOaepKeyWrap, encryptingKeyIdentifier))
End Function

Затем идентификатор SecurityKeyIdentifier используется для создания SamlSubject как части SamlToken.

SamlSubject CreateSamlSubjectForProofKey(SecurityKeyIdentifier proofKeyIdentifier)
{
    List<string> confirmations = new List<string>();

    confirmations.Add("urn:oasis:names:tc:SAML:1.0:cm:holder-of-key");

    return new SamlSubject(null, null, "IssuerName", confirmations, null, proofKeyIdentifier);
}
Function CreateSamlSubjectForProofKey( _
    ByVal proofKeyIdentifier As SecurityKeyIdentifier) As SamlSubject
    Dim confirmations As List(Of String) = New List(Of String)()
    confirmations.Add("urn:oasis:names:tc:SAML:1.0:cm:holder-of-key")
    Return New SamlSubject(Nothing, Nothing, "IssuerName", _
        confirmations, Nothing, proofKeyIdentifier)
End Function

Дополнительные сведения см. в примере федерации.

Создание ответных сообщений

После обработки службой маркеров безопасности запроса на выпуск и создания для выпуска маркера и ключа проверки должно быть создано ответное сообщение, включающее, по крайней мере, запрошенный маркер, маркер проверки и ссылки выпущенного маркера. Выпущенный маркер обычно является маркером SamlSecurityToken, созданным из SamlAssertion, как показано в следующем примере.

SecurityToken CreateIssuedToken(SamlAssertion assertion)
{
    return new SamlSecurityToken(assertion);
}
Function CreateIssuedToken(ByVal assertion As SamlAssertion) As SecurityToken
    Return New SamlSecurityToken(assertion)
End Function

В случае, когда служба маркеров безопасности предоставляет материал общего ключа, маркер проверки создается путем создания BinarySecretSecurityToken.

BinarySecretSecurityToken CreateProofToken(byte[] proofKey)
{
    return new BinarySecretSecurityToken(proofKey);
}
Function CreateProofToken(ByVal proofKey() As Byte) As BinarySecretSecurityToken
    Return New BinarySecretSecurityToken(proofKey)

End Function

Дополнительные сведения о создании маркера проверки, когда клиент и служба маркеров безопасности предоставляют материалы ключа для общего ключа, см . в примере федерации.

Ссылки выпущенного ключа создаются путем создания экземпляров класса SecurityKeyIdentifierClause.

SecurityKeyIdentifierClause CreateTokenReference(SamlSecurityToken token)
{
    return token.CreateKeyIdentifierClause<SamlAssertionKeyIdentifierClause>();
}
Function CreateTokenReference(ByVal token As SamlSecurityToken) _
    As SecurityKeyIdentifierClause
    Return token.CreateKeyIdentifierClause( _
    Of SamlAssertionKeyIdentifierClause)()
End Function

После этого различные значения сериализуются в ответное сообщение, возвращаемое клиенту.

Пример

Полный код службы маркеров безопасности см . в примере федерации.

См. также