Практическое руководство. Создание службы маркеров безопасности
Служба маркеров безопасности реализует протокол, определенный в спецификации WS-Trust. Данный протокол определяет форматы сообщения и шаблоны обмена сообщениями для выпуска, обновления, отмены и проверки маркеров безопасности. Данная служба маркеров безопасности дает одну или несколько из данных возможностей. В данном разделе рассматривается наиболее общий сценарий: реализация выпуска маркера.
Выпуск маркеров
WS-Trust определяет форматы сообщения на основе элемента схемы RequestSecurityToken
языка определения схемы XML (XSD) и элемента схемы XSD RequestSecurityTokenResponse
для выпуска маркера. Кроме того, WS-Trust определяет связанные универсальные коды ресурса (URI). URI действия, связанного с сообщением RequestSecurityToken
http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue
. URI действия, связанного с сообщением RequestSecurityTokenResponse
http://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.1
URI.Значение размера ключа, указывающее количество битов в ключе, связанное с выпущенным маркером.
Универсальный код ресурса (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
После этого различные значения сериализуются в ответное сообщение, возвращаемое клиенту.
Пример
Полный код службы маркеров безопасности см . в примере федерации.