Как создать службу маркеров безопасности
Служба маркеров безопасности реализует протокол, определенный в спецификации WS-Trust. Данный протокол определяет форматы сообщения и шаблоны обмена сообщениями для выпуска, обновления, отмены и проверки маркеров безопасности. Данная служба маркеров безопасности дает одну или несколько из данных возможностей. В данном разделе рассматривается наиболее общий сценарий: реализация выпуска маркера.
Выпуск маркеров
WS-Trust определяет форматы сообщения на основе элемента схемы RequestSecurityToken языка определения схемы XML (XSD) и элемента схемы XSD RequestSecurityTokenResponse для выпуска маркера. Кроме того, WS-Trust определяет связанные универсальные коды ресурса (URI). Универсальным кодом ресурса (URI) действия, связанным с сообщением RequestSecurityToken, является https://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue. Универсальным кодом ресурса действия, связанным с сообщением RequestSecurityTokenResponse является https://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.
Структура сообщения с запросом
Структура сообщения с запросом на выпуск обычно состоит из следующих элементов.
Тип запроса универсального кода ресурса (URI) со значением https://schemas.xmlsoap.org/ws/2005/02/trust/Issue.
Универсальный код ресурса (URI) типа маркера. Для маркеров языка SAML 1.1 значением данного универсального кода ресурса (URI) является http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1\#SAMLV1.1.
Значение размера ключа, указывающее количество битов в ключе, связанное с выпущенным маркером.
Универсальный код ресурса (URI) типа ключа. Для симметричных ключей значением данного универсального кода ресурсов (URI) является https://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKey.
Кроме того, может присутствовать несколько других элементов.
Материал ключа, предоставленный клиентом.
Информация об области, показывающая целевую службу, с которой будут использоваться выпущенные маркеры.
При создании ответного сообщения о выпуске служба маркеров безопасности использует информацию письма с запросом на выпуск.
Структура ответного сообщения
Структура ответного сообщения о выпуске обычно состоит из следующих элементов.
Выданный маркер безопасности, например, проверочное утверждение SAML 1.1.
Маркер проверки, связанный с маркером безопасности. Для симметричных ключей такой маркер часто является зашифрованной формой материала ключа.
Ссылки на выпущенный маркер безопасности. Обычно служба маркеров безопасности возвращает ссылку, которая может быть использована при появлении выданного маркера в последующем сообщении, отправленном клиентом, и другую ссылку, которая может быть использована, если маркер не присутствует в последующих сообщениях.
Кроме того, может присутствовать несколько других элементов.
Материал ключа, предоставленный службой маркеров безопасности.
Алгоритм, необходимый для расчета общего ключа.
Сведения о времени существования выпущенного маркера.
Сообщения с запросом на обработку
Служба маркеров безопасности обрабатывает запросы на выпуск, анализируя различные фрагменты сообщения с запросом и проверяя возможность выпуска маркера, соответствующего запросу. Перед созданием выпускаемого маркера служба маркеров безопасности должна определить следующее.
Действительно ли запрос является запросом на выпуск маркера.
Поддерживает ли служба маркеров безопасности запрошенный тип маркера.
Авторизован ли автор заявки на подачу заявки.
Может ли служба маркеров безопасности оправдать ожидания автора заявки, относящиеся к материалу ключа.
Две ответственные части создания маркера определяют, каким ключом подписать маркер и при помощи какого ключа зашифровать общий ключ. Ключ должен быть подписан так, чтобы при предоставлении клиентом ключа целевой службе данная служба могла определить, что маркер был выпущен службой безопасности ключей, которой она доверяет. Материал ключа должен быть зашифрован так, чтобы целевая служба могла расшифровать данный материал ключа.
Подписывание утверждения SAML включает создание экземпляра SigningCredentials. Конструктор для данного класса принимает следующее
SecurityKey для ключа, который будет использоваться при подписывании утверждения SAML.
Строка, определяющая используемый алгоритм подписывания.
Строка, определяющая используемый алгоритм дайджест-проверки.
Дополнительно можно указать SecurityKeyIdentifier, определяющий используемый для подписывания утверждения ключ.
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
void AddSigningCredentials(SamlAssertion assertion, SecurityKey signingKey)
{
SigningCredentials sc = new SigningCredentials(signingKey,
SecurityAlgorithms.RsaSha1Signature, SecurityAlgorithms.Sha1Digest);
assertion.SigningCredentials = sc;
}
Шифрование общего ключа предполагает принятие материала ключа и его шифрование при помощи ключа, который целевая служба сможет использовать для расшифровки общего ключа. Обычно используется открытый ключ целевой службы.
Function EncryptKey(ByVal plainTextKey() As Byte, _
ByVal encryptingKey As SecurityKey) As Byte()
Return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey)
End Function
byte[] EncryptKey(byte[] plainTextKey, SecurityKey encryptingKey)
{
return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey);
}
Кроме того, для зашифрованного ключа необходим идентификатор SecurityKeyIdentifier.
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 GetKeyIdentifierForEncryptedKey(byte[] encryptedKey,
SecurityToken encryptingToken)
{
SecurityKeyIdentifier encryptingKeyIdentifier = new SecurityKeyIdentifier(encryptingToken.CreateKeyIdentifierClause<X509ThumbprintKeyIdentifierClause>());
return new SecurityKeyIdentifier(new EncryptedKeyIdentifierClause(encryptedKey, SecurityAlgorithms.RsaOaepKeyWrap, encryptingKeyIdentifier));
}
Затем идентификатор SecurityKeyIdentifier используется для создания SamlSubject как части SamlToken.
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
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);
}
Дополнительные сведения см. в разделе Образец федерации.
Создание ответных сообщений
После обработки службой маркеров безопасности запроса на выпуск и создания для выпуска маркера и ключа проверки должно быть создано ответное сообщение, включающее, по крайней мере, запрошенный маркер, маркер проверки и ссылки выпущенного маркера. Выпущенный маркер обычно является маркером SamlSecurityToken, созданным из SamlAssertion, как показано в следующем примере.
Function CreateIssuedToken(ByVal assertion As SamlAssertion) As SecurityToken
Return New SamlSecurityToken(assertion)
End Function
SecurityToken CreateIssuedToken(SamlAssertion assertion)
{
return new SamlSecurityToken(assertion);
}
В случае, когда служба маркеров безопасности предоставляет материал общего ключа, маркер проверки создается путем создания BinarySecretSecurityToken.
Function CreateProofToken(ByVal proofKey() As Byte) As BinarySecretSecurityToken
Return New BinarySecretSecurityToken(proofKey)
End Function
BinarySecretSecurityToken CreateProofToken(byte[] proofKey)
{
return new BinarySecretSecurityToken(proofKey);
}
Дополнительные сведения том, как создавать маркер проверки, когда и служба клиента, и служба маркеров безопасности предоставляют материал ключа для общего ключа, см. Образец федерации.
Ссылки выпущенного ключа создаются путем создания экземпляров класса SecurityKeyIdentifierClause.
Function CreateTokenReference(ByVal token As SamlSecurityToken) _
As SecurityKeyIdentifierClause
Return token.CreateKeyIdentifierClause( _
Of SamlAssertionKeyIdentifierClause)()
End Function
SecurityKeyIdentifierClause CreateTokenReference(SamlSecurityToken token)
{
return token.CreateKeyIdentifierClause<SamlAssertionKeyIdentifierClause>();
}
После этого различные значения сериализуются в ответное сообщение, возвращаемое клиенту.
Пример
Полный код для службы маркеров безопасности см. в Образец федерации.
См. также
Задачи
Справочник
SigningCredentials
SecurityKey
SecurityKeyIdentifier
SamlSecurityToken
SamlAssertion
BinarySecretSecurityToken
SecurityKeyIdentifierClause