SecurityTokenService Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Абстрактный базовый класс, который определяет свойства и методы службы токенов безопасности (STS).
public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
- Наследование
-
SecurityTokenService
Примеры
Примеры кода, используемые в разделах SecurityTokenService , взяты из Custom Token
примера. Этот пример предоставляет пользовательские классы, обеспечивающие обработку простых веб-маркеров (SWT), и включает реализацию пассивной службы маркеров маркеров безопасности, которая может обслуживать маркер SWT. Пример реализации активной службы STS см. в этом Federation Metadata
примере. Сведения об этих и других примерах, доступных для WIF, и о том, где их можно скачать, см. в разделе Пример индекса кода WIF. В следующем коде показана реализация пассивной службы sts с помощью SecurityTokenService класса .
using System;
using System.IdentityModel;
using System.IdentityModel.Configuration;
using System.IdentityModel.Protocols.WSTrust;
using System.IdentityModel.Tokens;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;
namespace PassiveSTS
{
/// <summary>
/// Overrides the SecurityTokenService class to provide
/// the relying party related information, such as encryption credentials to encrypt the issued
/// token, signing credentials to sign the issued token, claims that the STS wants to issue for a
/// certain token request, as well as the claim types that this STS is capable
/// of issuing.
/// </summary>
public class CustomSecurityTokenService : SecurityTokenService
{
// Certificate Constants
private const string SIGNING_CERTIFICATE_NAME = "CN=localhost";
private const string ENCRYPTING_CERTIFICATE_NAME = "CN=localhost";
private SigningCredentials _signingCreds;
private EncryptingCredentials _encryptingCreds;
// Used for validating applies to address, set to URI used in RP app of application, could also have been done via config
private string _addressExpected = "http://localhost:19851/";
public CustomSecurityTokenService(SecurityTokenServiceConfiguration configuration)
: base(configuration)
{
// Setup the certificate our STS is going to use to sign the issued tokens
_signingCreds = new X509SigningCredentials(CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, SIGNING_CERTIFICATE_NAME));
// Note: In this sample app only a si ngle RP identity is shown, which is localhost, and the certificate of that RP is
// populated as _encryptingCreds
// If you have multiple RPs for the STS you would select the certificate that is specific to
// the RP that requests the token and then use that for _encryptingCreds
_encryptingCreds = new X509EncryptingCredentials(CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, ENCRYPTING_CERTIFICATE_NAME));
}
/// <summary>
/// This method returns the configuration for the token issuance request. The configuration
/// is represented by the Scope class. In our case, we are only capable of issuing a token to a
/// single RP identity represented by the _encryptingCreds field.
/// </summary>
/// <param name="principal">The caller's principal</param>
/// <param name="request">The incoming RST</param>
/// <returns></returns>
protected override Scope GetScope(ClaimsPrincipal principal, RequestSecurityToken request)
{
// Validate the AppliesTo address
ValidateAppliesTo( request.AppliesTo );
// Create the scope using the request AppliesTo address and the RP identity
Scope scope = new Scope( request.AppliesTo.Uri.AbsoluteUri, _signingCreds );
if (Uri.IsWellFormedUriString(request.ReplyTo, UriKind.Absolute))
{
if (request.AppliesTo.Uri.Host != new Uri(request.ReplyTo).Host)
scope.ReplyToAddress = request.AppliesTo.Uri.AbsoluteUri;
else
scope.ReplyToAddress = request.ReplyTo;
}
else
{
Uri resultUri = null;
if (Uri.TryCreate(request.AppliesTo.Uri, request.ReplyTo, out resultUri))
scope.ReplyToAddress = resultUri.AbsoluteUri;
else
scope.ReplyToAddress = request.AppliesTo.Uri.ToString() ;
}
// Note: In this sample app only a single RP identity is shown, which is localhost, and the certificate of that RP is
// populated as _encryptingCreds
// If you have multiple RPs for the STS you would select the certificate that is specific to
// the RP that requests the token and then use that for _encryptingCreds
scope.EncryptingCredentials = _encryptingCreds;
return scope;
}
/// <summary>
/// This method returns the content of the issued token. The content is represented as a set of
/// IClaimIdentity intances, each instance corresponds to a single issued token. Currently, the Windows Identity Foundation only
/// supports a single token issuance, so the returned collection must always contain only a single instance.
/// </summary>
/// <param name="scope">The scope that was previously returned by GetScope method</param>
/// <param name="principal">The caller's principal</param>
/// <param name="request">The incoming RST, we don't use this in our implementation</param>
/// <returns></returns>
protected override ClaimsIdentity GetOutputClaimsIdentity( ClaimsPrincipal principal, RequestSecurityToken request, Scope scope )
{
//
// Return a default claim set which contains a custom decision claim
// Here you can actually examine the user by looking at the IClaimsPrincipal and
// return the right decision based on that.
//
ClaimsIdentity outgoingIdentity = new ClaimsIdentity();
outgoingIdentity.AddClaims(principal.Claims);
return outgoingIdentity;
}
/// <summary>
/// Validates the appliesTo and throws an exception if the appliesTo is null or appliesTo contains some unexpected address.
/// </summary>
/// <param name="appliesTo">The AppliesTo parameter in the request that came in (RST)</param>
/// <returns></returns>
void ValidateAppliesTo(EndpointReference appliesTo)
{
if (appliesTo == null)
{
throw new InvalidRequestException("The appliesTo is null.");
}
if (!appliesTo.Uri.Equals(new Uri(_addressExpected)))
{
throw new InvalidRequestException(String.Format("The relying party address is not valid. Expected value is {0}, the actual value is {1}.", _addressExpected, appliesTo.Uri.AbsoluteUri));
}
}
}
}
В следующем коде показано, как вызвать пользовательскую пассивную службу STS для обработки запроса WS-Federation путем вызова FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) метода из кода программной default.aspx.cs
части в файле .
using System;
using System.IdentityModel.Services;
using System.Security.Claims;
namespace PassiveSTS
{
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// We perform the WS-Federation Passive Protocol processing in this method.
/// </summary>
protected void Page_PreRender( object sender, EventArgs e )
{
FederatedPassiveSecurityTokenServiceOperations.ProcessRequest( Request, User as ClaimsPrincipal, CustomSecurityTokenServiceConfiguration.Current.CreateSecurityTokenService(), Response );
}
}
}
Комментарии
Чтобы создать STS, необходимо наследоваться SecurityTokenService от класса . В пользовательском классе необходимо как минимум переопределить методы GetScope и GetOutputClaimsIdentity . С помощью этих переопределений служба маркеров безопасности, созданная с использованием реализации по умолчанию всех других методов, определенных в классе , может выдавать маркеры безопасности в ответ на запросы маркеров безопасности (RST). То есть реализуется привязка issue, определенная в спецификации WS-Trust. Эта привязка реализована в методе Issue . Никакие другие WS-Trust привязки (продление, отмена и проверка) не реализуются в случае по умолчанию, и при обнаружении RST, соответствующего одной из этих привязок, вызывающей объекту возвращается соответствующая ошибка. Вы можете, конечно, переопределить соответствующие методы (Renew, Cancelи Validate), чтобы реализовать эти привязки в службе STS.
Важно!
Реализация готовой к работе службы sts требует тщательного планирования и значительных ресурсов для снижения потенциальных рисков безопасности, связанных с предоставлением такой службы. Большинство разработчиков, использующих Windows Identity Foundation (WIF), будут разрабатывать приложения, которые передают управление удостоверениями на аутсорсинг службе STS, а не сами службы sts. WIF предоставляет расширение Visual Studio , средство идентификации и доступа для Visual Studio 2012, чтобы помочь разработчикам тестировать решения в среде разработки. Это средство включает службу sts , LocalSTS
которую можно настроить для обслуживания определенных утверждений для разрабатываемого приложения. Дополнительные сведения о средстве идентификации и доступа см. в статье Средство идентификации и доступа для Visual Studio 2012. В некоторых сценариях может не предоставлять функциональные возможности, LocalSTS
необходимые для адекватного тестирования приложения. Например, в сценарии, который включает в себя разработку пользовательского обработчика маркеров для использования приложением. В таких случаях можно наследовать от SecurityTokenService , чтобы создать одну или несколько простых stSS, которые можно развернуть в среде разработки и которые можно использовать для тестирования таких функций в приложении. Остальная часть этого раздела посвящена методам, предоставляемым классом SecurityTokenService , которые позволяют реализовать простую sts и расширить конвейер выдачи маркеров.
В следующем списке представлен краткий обзор методов, которые имеют первостепенное значение для разработчика для использования в тестовой среде или среде разработки.
метод GetScope ; Этот метод возвращает Scope объект , содержащий сведения о проверяющей стороны. Этот объект используется в остальной части конвейера выдачи маркеров и содержит сведения об учетных данных для подписывания и шифрования для использования в ответе, а также
AppliesTo
адреса иReplyTo
(при необходимости). Этот метод необходимо переопределить.метод GetOutputClaimsIdentity ; Этот метод возвращает ClaimsIdentity объект , содержащий утверждения, возвращаемые в проверяющую сторона. Этот метод необходимо переопределить.
метод Issue ; Этот метод реализует конвейер запросов маркеров, который обрабатывает входящий запрос маркера безопасности (RST) и возвращает вызывающей объекту ответ (RSTR), содержащий маркер, который можно использовать для проверки подлинности с помощью поставщика ресурсов. Многие другие методы, определенные в SecurityTokenService классе , вызываются из этого метода, включая методы GetScope и GetOutputClaimsIdentity . Вам не нужно переопределять этот метод, но понимание конвейера запросов маркеров, который он реализует, может быть полезным.
StS настраивается с помощью SecurityTokenServiceConfiguration класса .
Примечания для тех, кто реализует этот метод
Необходимо переопределить методы GetScope(ClaimsPrincipal, RequestSecurityToken) и GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) .
Конструкторы
SecurityTokenService(SecurityTokenServiceConfiguration) |
При вызове из производных классов для инициализации класса SecurityTokenService, используя заданные параметры конфигурации. |
Свойства
Principal |
Получает или задает субъект, связанный с текущим экземпляром. |
Request |
Получает или задает запрос на токен безопасности (RST), связанный с текущим экземпляром. |
Scope |
Получает или задает область, связанную с текущим экземпляром. |
SecurityTokenDescriptor |
Получает или задает SecurityTokenDescriptor, связанный с текущим экземпляром. |
SecurityTokenServiceConfiguration |
Получает экземпляр конфигурации владельца. |
Методы
BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный запрос WS-Trust Cancel. |
BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный вызов метода GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope). |
BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный вызов метода GetScope(ClaimsPrincipal, RequestSecurityToken). |
BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный запрос WS-Trust Issue. |
BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный запрос WS-Trust Renew. |
BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
При переопределении в производном классе начинает асинхронный запрос WS-Trust Validate. |
Cancel(ClaimsPrincipal, RequestSecurityToken) |
При переопределении в производном классе обрабатывает запрос WS-Trust Cancel. |
CreateSecurityTokenDescriptor(RequestSecurityToken, Scope) |
Создает экземпляр класса SecurityTokenDescriptor. |
EndCancel(IAsyncResult) |
При переопределении в производном классе завершает асинхронный запрос WS-Trust Cancel. |
EndGetOutputClaimsIdentity(IAsyncResult) |
При переопределении в производном классе завершает асинхронный вызов метода BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object). |
EndGetScope(IAsyncResult) |
При переопределении в производном классе завершает асинхронный вызов метода BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object). |
EndIssue(IAsyncResult) |
При переопределении в производном классе завершает асинхронный запрос WS-Trust Issue. |
EndRenew(IAsyncResult) |
При переопределении в производном классе завершает асинхронный запрос WS-Trust Renew. |
EndValidate(IAsyncResult) |
При переопределении в производном классе завершает асинхронный запрос WS-Trust Validate. |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetIssuerName() |
Получает имя службы токенов безопасности (STS). |
GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) |
При переопределении в производном классе этот метод возвращает коллекцию выходных субъектов, которые должны быть включены в выданный токен. |
GetProofToken(RequestSecurityToken, Scope) |
Получает токен проверки для включения в отклик (RSTR). |
GetRequestorProofEncryptingCredentials(RequestSecurityToken) |
Получает учетные данные шифрования проверки запрашивающей стороны. |
GetResponse(RequestSecurityToken, SecurityTokenDescriptor) |
Создает ответ (RSTR), содержащий токен выданный за счет заданного запроса (RST) и токена безопасности. |
GetScope(ClaimsPrincipal, RequestSecurityToken) |
Получает объект Scope, содержащий информацию о проверяющей стороне (RP), связанной с указанным запросом (RST). Этот метод необходимо переопределить при реализации класса SecurityTokenService. |
GetSecurityTokenHandler(String) |
Получает соответствующий обработчик токенов безопасности для создания токена безопасности указанного типа. |
GetTokenLifetime(Lifetime) |
Получает время жизни выданного токена. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
Issue(ClaimsPrincipal, RequestSecurityToken) |
Выдает токен безопасности. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
Renew(ClaimsPrincipal, RequestSecurityToken) |
При переопределении в производном классе обрабатывает запрос WS-Trust Renew. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Validate(ClaimsPrincipal, RequestSecurityToken) |
При переопределении в производном классе обрабатывает запрос WS-Trust Validate. |
ValidateRequest(RequestSecurityToken) |
Проверяет запрос токена безопасности (RST), инкапсулированный данным экземпляром. |