SecurityTokenService Classe

Definição

A classe base abstrata que define as propriedades e métodos de um serviço de token de segurança (STS).

public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
Herança
SecurityTokenService

Exemplos

Os exemplos de código usados nos SecurityTokenService tópicos são retirados da Custom Token amostra. Este exemplo fornece classes personalizadas que permitem o processamento de Simples Web Tokens (SWT) e inclui uma implementação de um STS passivo capaz de servir um token SWT. Para um exemplo de como implementar um STS ativo, pode ver a Federation Metadata amostra. Para informações sobre estes exemplos e outros disponíveis para WIF e sobre onde os descarregar, consulte o Índice de Exemplos de Código WIF. O código seguinte mostra a implementação de um STS passivo usando a SecurityTokenService classe.

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));
            }
        }

    }
}

O código seguinte mostra como invocar um STS passivo personalizado para processar um pedido de WS-Federation, chamando o FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) método a partir do código por trás no default.aspx.cs ficheiro.

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 );
        }
    }
}

Observações

Para criar um STS tens de derivar da SecurityTokenService classe. Na tua classe personalizada deves, no mínimo, sobrescrever os GetScope métodos and GetOutputClaimsIdentity . Com estas sobrescrições, o STS criado usando a implementação padrão de todos os outros métodos definidos na classe é capaz de emitir tokens de segurança em resposta a pedidos de token de segurança (RST). Ou seja, a ligação Issue definida na especificação WS-Trust é implementada. Esta ligação é implementada no Issue método. Nenhuma das outras ligações de WS-Trust (Renovar, Cancelar e Validar) é implementada no caso padrão e uma falha apropriada é devolvida ao chamador se for encontrada uma RST correspondente a uma dessas ligações. Podes, claro, sobrescrever os métodos apropriados (Renew, Cancel, e Validate) para implementar estas ligações no teu STS.

Importante

Implementar um STS pronto para produção exige um planeamento cuidadoso e recursos consideráveis para mitigar os potenciais riscos de segurança inerentes à exposição de tal serviço. A maioria dos programadores que utilizam o Windows Identity Foundation (WIF) estará a desenvolver aplicações que terceirizam a gestão de identidades para um STS, em vez de desenvolverem um STS propriamente dito. A WIF disponibiliza uma extensão do Visual Studio, a Identity and Access Tool for Visual Studio 2012, para ajudar os programadores a testar soluções no ambiente de desenvolvimento. Esta ferramenta inclui um STS, LocalSTS, que pode configurar para servir reivindicações específicas à aplicação que está a desenvolver. Para mais informações sobre a ferramenta de Identidade e Acesso, consulte Identidade e Ferramenta de Acesso para Visual Studio 2012. Em alguns cenários, LocalSTS pode não fornecer a funcionalidade necessária para testar adequadamente a sua aplicação; por exemplo, num cenário que envolve o desenvolvimento de um manipulador de tokens personalizado para uso por uma aplicação. Nestes casos, pode derivar de SecurityTokenService criar um ou mais STS simples que podem ser implementados no seu ambiente de desenvolvimento e que podem ser usados para testar tais funcionalidades na sua aplicação. O restante desta secção foca-se nos métodos expostos pela SecurityTokenService classe que permitem implementar um STS simples e expandir o pipeline de emissão de tokens.

A lista seguinte fornece uma breve visão geral dos métodos de importância primária para o programador para utilização num ambiente de teste ou desenvolvimento.

  • O método GetScope. Este método devolve um Scope objeto que contém informação sobre o RP. Este objeto é utilizado no restante pipeline de emissão de tokens e inclui informações sobre as credenciais de assinatura e encriptação a usar na resposta, bem como os AppliesTo endereços e ReplyTo (se necessário). Deve ultrapassar este método.

  • O método GetOutputClaimsIdentity. Este método devolve um ClaimsIdentity objeto que contém as reivindicações para regressar ao RP. Deve ultrapassar este método.

  • O método Issue. Este método implementa o pipeline de pedidos de token, que processa um pedido de token de segurança (RST) recebido e devolve uma resposta (RSTR) ao chamador que contém um token que pode ser usado para autenticar com um RP. Muitos dos outros métodos definidos na SecurityTokenService classe são chamados a partir deste método, incluindo os GetScope métodos e GetOutputClaimsIdentity . Não é necessário sobrepor este método, mas compreender o pipeline de pedidos de token que ele implementa pode ser útil.

Um STS é configurado através da SecurityTokenServiceConfiguration classe.

Notas para Implementadores

Deve sobrepor tanto o GetScope(ClaimsPrincipal, RequestSecurityToken) e como os GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) métodos.

Construtores

Name Description
SecurityTokenService(SecurityTokenServiceConfiguration)

Chamado a partir de classes derivadas para inicializar a SecurityTokenService classe usando as definições de configuração especificadas.

Propriedades

Name Description
Principal

Obtém ou define o principal associado à instância atual.

Request

Recebe ou define o pedido de token de segurança (RST) associado à instância atual.

Scope

Obtém ou define o âmbito associado à instância atual.

SecurityTokenDescriptor

Obtém ou define o associado SecurityTokenDescriptor à instância atual.

SecurityTokenServiceConfiguration

Obtém a instância de configuração do proprietário.

Métodos

Name Description
BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando é sobreposto numa classe derivada, inicia-se um pedido assíncrono de WS-Trust Cancelar.

BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object)

Quando sobrescrito numa classe derivada, inicia-se uma chamada assíncrona ao GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) método.

BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sobrescrito numa classe derivada, inicia-se uma chamada assíncrona para o GetScope(ClaimsPrincipal, RequestSecurityToken) método.

BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sobrescrito numa classe derivada, inicia-se um pedido assíncrono de WS-Trust Issue.

BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sobrescrito numa classe derivada, inicia-se um pedido assíncrono de WS-Trust Renew.

BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando é sobreposto numa classe derivada, inicia-se um pedido assíncrono de validação WS-Trust.

Cancel(ClaimsPrincipal, RequestSecurityToken)

Quando é sobreposto numa classe derivada, processa um pedido de WS-Trust Cancel.

CreateSecurityTokenDescriptor(RequestSecurityToken, Scope)

Cria uma instância de um SecurityTokenDescriptor.

EndCancel(IAsyncResult)

Quando sobrescrito numa classe derivada, completa o pedido assíncrono de WS-Trust Cancel.

EndGetOutputClaimsIdentity(IAsyncResult)

Quando sobrescrito numa classe derivada, completa a chamada assíncrona ao BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) método.

EndGetScope(IAsyncResult)

Quando sobrescrito numa classe derivada, completa a chamada assíncrona ao BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) método.

EndIssue(IAsyncResult)

Quando sobrescrito numa classe derivada, completa o pedido assíncrono de WS-Trust Issue.

EndRenew(IAsyncResult)

Quando sobrescrito numa classe derivada, completa o pedido assíncrono de WS-Trust Renovação.

EndValidate(IAsyncResult)

Quando sobrescrito numa classe derivada, completa o pedido assíncrono WS-Trust Validar.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetIssuerName()

Recebe o nome do serviço de token de segurança (STS).

GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope)

Quando sobreposto numa classe derivada, este método devolve uma coleção de sujeitos de saída para serem incluídos no token emitido.

GetProofToken(RequestSecurityToken, Scope)

Obtém que o token de prova seja incluído na resposta (RSTR).

GetRequestorProofEncryptingCredentials(RequestSecurityToken)

Obtém a prova do requerente que encripta as credenciais.

GetResponse(RequestSecurityToken, SecurityTokenDescriptor)

Cria a resposta (RSTR) que contém o token emitido usando o pedido especificado (RST) e o descritor do token de segurança.

GetScope(ClaimsPrincipal, RequestSecurityToken)

Obtém um Scope objeto que contém informação sobre a parte confiável (RP) associada ao pedido especificado (RST). Tens de sobrescrever este método na tua implementação da SecurityTokenService classe.

GetSecurityTokenHandler(String)

Obtém o gestor de token de segurança apropriado para emitir um token de segurança do tipo especificado.

GetTokenLifetime(Lifetime)

Recebe a vida útil do token emitido.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
Issue(ClaimsPrincipal, RequestSecurityToken)

Emite um token de segurança.

MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
Renew(ClaimsPrincipal, RequestSecurityToken)

Quando é sobreposto numa classe derivada, processa um pedido de renovação WS-Trust.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
Validate(ClaimsPrincipal, RequestSecurityToken)

Quando sobrescrito numa classe derivada, processa um pedido de validação WS-Trust.

ValidateRequest(RequestSecurityToken)

Valida o pedido de token de segurança (RST) encapsulado por esta instância.

Aplica-se a

Ver também