Создаю SecurityToken с помощью Saml2SecurityToken следующим образом:
SecurityToken st = new Saml2SecurityToken(
new Saml2Assertion(new Saml2NameIdentifier("localUser"))
{
Statements =
{
new Saml2AttributeStatement(new List<Saml2Attribute>()
{
new Saml2Attribute(
"http://identityserver.thinktecture.com/claims/identityprovider",
"promProvider")
}),
new Saml2AuthenticationStatement(new Saml2AuthenticationContext(
new Uri("urn:oasis:names:tc:SAML:2.0:ac:classes:Password")))
},
Subject = new Saml2Subject(new Saml2NameIdentifier("administrator")) {
SubjectConfirmations = { new Saml2SubjectConfirmation(
new Uri("urn:oasis:names:tc:SAML:2.0:cm:bearer"))}},
SigningCredentials = new SigningCredentials(
new X509AsymmetricSecurityKey(certificate),
SecurityAlgorithms.RsaSha256Signature,
SecurityAlgorithms.Sha256Digest,
new SecurityKeyIdentifier() { new X509RawDataKeyIdentifierClause(certificate) })
}, new ReadOnlyCollection<SecurityKey>(new List<SecurityKey>()), securityToken);
Все это используется для того, чтобы создать прокси сервиса, работающего по протоколу безопасности: WS2007FederationHttpBinding и работает успешно, не буду углубляться в подробности, так как суть вопроса другая. Вопрос следующий, имеются строки, которые я прописываю руками, что мне не очень нравится, а именно:
"urn:oasis:names:tc:SAML:2.0:ac:classes:Password" - Authentication Context Class URI"urn:oasis:names:tc:SAML:2.0:cm:bearer" - Subject Confirmation MethodИмеются ли какие-либо справочники, откуда я могу достать эти строки, к примеру перечисления или классы, в которых это хранится, такого плана:
// "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
var rsaSha256Signature = SecurityAlgorithms.RsaSha256Signature;
// "http://www.w3.org/2001/04/xmlenc#sha256"
var sha256 = SecurityAlgorithms.Sha256Digest;
Если имеются, то откуда я могу их получить?
Решение следующее: создавать SecurityToken через SecurityTokenDescriptor с помощью Saml2SecurityTokenHandler. В этом случае константы не нужны. В результате кода стало меньше и выглядеть код стал приятно:
var saml2SecurityTokenHandler = new Saml2SecurityTokenHandler();
var securityTokenDescriptor = new SecurityTokenDescriptor()
{
TokenIssuerName = "production",
Subject = new ClaimsIdentity("administrator"),
Token = new X509SecurityToken(certificate),
SigningCredentials = new SigningCredentials(
new X509AsymmetricSecurityKey(certificate),
SecurityAlgorithms.RsaSha256Signature,
SecurityAlgorithms.Sha256Digest,
new SecurityKeyIdentifier() { new X509RawDataKeyIdentifierClause(certificate) })
};
var securityToken = saml2SecurityTokenHandler.CreateToken(securityTokenDescriptor);
К решению данного вопроса пришел с помощью советов от пользователя @PavelMayorov, ему отдельное спасибо. А константы так и не нашел, если найду - дополню свой ответ.
Последовал очередному совету по поводу использования X509SigningCredentials вместо SigningCredentials и получилось то, что меня устраивает в качестве конечного результата:
var saml2SecurityTokenHandler = new Saml2SecurityTokenHandler();
var securityTokenDescriptor = new SecurityTokenDescriptor()
{
TokenIssuerName = "ibzkh",
Subject = new ClaimsIdentity("administrator"),
Token = new X509SecurityToken(certificate),
SigningCredentials = new X509SigningCredentials(certificate)
};
var securityToken = saml2SecurityTokenHandler.CreateToken(securityTokenDescriptor);
Все работает стабильно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей