SecurityTokenService Classe

Definizione

Classe base astratta che definisce le proprietà e i metodi di un servizio token di sicurezza.The abstract base class that define the properties and methods of a security token service (STS).

public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
Ereditarietà
SecurityTokenService

Esempio

Gli esempi di codice usati negli SecurityTokenService argomenti sono tratti dall'esempio Custom Token . Questo esempio fornisce classi personalizzate che consentono l'elaborazione di token Web semplici (SWT) e include un'implementazione di un servizio token di sicurezza passivo in grado di gestire un token SWT. Per un esempio di come implementare un servizio token di sicurezza attivo, è possibile visualizzare l'esempio Federation Metadata . Per informazioni su questi esempi e altri esempi disponibili per WIF e su dove scaricarli, vedere Indice di esempio di codice WIF. Il codice seguente illustra l'implementazione di un servizio token di sicurezza passivo usando la 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));
            }
        }

    }
}

Il codice seguente illustra come richiamare un servizio token di sicurezza passivo personalizzato per elaborare una richiesta di WS-Federation chiamando il FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) metodo dal code-behind nel default.aspx.cs file.

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

Commenti

Per creare un servizio token di sicurezza, è necessario derivare dalla SecurityTokenService classe . Nella classe personalizzata è necessario eseguire almeno l'override dei GetScope metodi e GetOutputClaimsIdentity . Con queste sostituzioni, il servizio token di sicurezza creato usando l'implementazione predefinita di tutti gli altri metodi definiti nella classe è in grado di emettere token di sicurezza in risposta alle richieste del token di sicurezza (RST). Ovvero, viene implementata l'associazione Issue definita nella specifica WS-Trust. Questa associazione viene implementata nel Issue metodo . Nessuna delle altre associazioni WS-Trust (Renew, Cancel e Validate) viene implementata nel caso predefinito e viene restituito un errore appropriato al chiamante se viene rilevato un RST che corrisponde a una di queste associazioni. Naturalmente, è possibile eseguire l'override dei metodi appropriati (Renew, Cancele Validate) per implementare queste associazioni nel servizio token di sicurezza.

Importante

L'implementazione di un servizio token di sicurezza pronto per la produzione comporta un'attenta pianificazione e notevoli risorse per attenuare i potenziali rischi di sicurezza intrinseci nell'esposizione di tale servizio. La maggior parte degli sviluppatori che usano Windows Identity Foundation (WIF) sta sviluppando applicazioni che esternalizzano la gestione delle identità a un servizio token di sicurezza, anziché sviluppare un servizio token di sicurezza stesso. WIF offre un'estensione Visual Studio, lo strumento di identità e accesso per Visual Studio 2012, per aiutare gli sviluppatori a testare le soluzioni nell'ambiente di sviluppo. Questo strumento include un servizio token di sicurezza, LocalSTS, che è possibile configurare per gestire attestazioni specifiche per l'applicazione in fase di sviluppo. Per altre informazioni sullo strumento Identity and Access, vedere Identity and Access Tool for Visual Studio 2012. In alcuni scenari, LocalSTS potrebbe non fornire la funzionalità necessaria per testare adeguatamente l'applicazione, ad esempio in uno scenario che prevede lo sviluppo di un gestore di token personalizzato da usare da un'applicazione. In questi casi, è possibile derivare da SecurityTokenService per creare uno o più servizi token di sicurezza semplici che possono essere distribuiti nell'ambiente di sviluppo e che possono essere usati per testare tali funzionalità nell'applicazione. La parte restante di questa sezione è incentrata sui metodi esposti dalla SecurityTokenService classe che consentono di implementare un servizio token di sicurezza semplice ed estendere la pipeline di rilascio dei token.

L'elenco seguente offre una breve panoramica dei metodi di importanza primaria per lo sviluppatore per l'uso in un ambiente di test o sviluppo.

  • Metodo GetScope. Questo metodo restituisce un Scope oggetto che contiene informazioni sulla rp. Questo oggetto viene usato nel resto della pipeline di rilascio dei token e include informazioni sulla firma e la crittografia delle credenziali da usare nella risposta, nonché gli AppliesTo indirizzi e ReplyTo (se necessario). È necessario eseguire l'override di questo metodo.

  • Metodo GetOutputClaimsIdentity. Questo metodo restituisce un ClaimsIdentity oggetto che contiene le attestazioni da restituire al punto di ripristino. È necessario eseguire l'override di questo metodo.

  • Metodo Issue. Questo metodo implementa la pipeline di richiesta di token, che elabora una richiesta di token di sicurezza in ingresso (RST) e restituisce una risposta (RSTR) al chiamante che contiene un token che può essere usato per l'autenticazione con un punto di ripristino. Molti degli altri metodi definiti nella SecurityTokenService classe vengono chiamati da questo metodo, inclusi i GetScope metodi e GetOutputClaimsIdentity . Non è necessario eseguire l'override di questo metodo, ma una conoscenza della pipeline di richiesta di token implementata può essere utile.

Un servizio token di sicurezza viene configurato tramite la SecurityTokenServiceConfiguration classe .

Note per gli implementatori

È necessario eseguire l'override GetScope(ClaimsPrincipal, RequestSecurityToken) dei metodi e .GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope)

Costruttori

Nome Descrizione
SecurityTokenService(SecurityTokenServiceConfiguration)

Chiamato dalle classi derivate per inizializzare la SecurityTokenService classe usando le impostazioni di configurazione specificate.

Proprietà

Nome Descrizione
Principal

Ottiene o imposta l'entità associata all'istanza corrente.

Request

Ottiene o imposta la richiesta del token di sicurezza (RST) associata all'istanza corrente.

Scope

Ottiene o imposta l'ambito associato all'istanza corrente.

SecurityTokenDescriptor

Ottiene o imposta l'oggetto SecurityTokenDescriptor associato all'istanza corrente.

SecurityTokenServiceConfiguration

Ottiene l'istanza di configurazione del proprietario.

Metodi

Nome Descrizione
BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando ne viene eseguito l'override in una classe derivata, inizia una richiesta asincrona WS-Trust Cancel.

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

Quando sottoposto a override in una classe derivata, avvia una chiamata asincrona al GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) metodo .

BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sottoposto a override in una classe derivata, inizia una chiamata asincrona per il GetScope(ClaimsPrincipal, RequestSecurityToken) metodo .

BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sottoposto a override in una classe derivata, inizia una richiesta di WS-Trust asincrona Problema.

BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sottoposto a override in una classe derivata, inizia una richiesta di rinnovo asincrona WS-Trust.

BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Quando sottoposto a override in una classe derivata, inizia una richiesta di convalida asincrona WS-Trust.

Cancel(ClaimsPrincipal, RequestSecurityToken)

Quando sottoposto a override in una classe derivata, elabora una richiesta di annullamento WS-Trust.

CreateSecurityTokenDescriptor(RequestSecurityToken, Scope)

Crea un'istanza di un oggetto SecurityTokenDescriptor.

EndCancel(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la richiesta di annullamento WS-Trust asincrona.

EndGetOutputClaimsIdentity(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la chiamata asincrona al BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) metodo .

EndGetScope(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la chiamata asincrona al BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) metodo .

EndIssue(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la richiesta di WS-Trust asincrona Problema.

EndRenew(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la richiesta di rinnovo asincrona WS-Trust.

EndValidate(IAsyncResult)

Quando sottoposto a override in una classe derivata, completa la richiesta di convalida asincrona WS-Trust.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetIssuerName()

Ottiene il nome del servizio token di sicurezza.Get the name of the security token service (STS).

GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope)

In caso di override in una classe derivata, questo metodo restituisce una raccolta di soggetti di output da includere nel token rilasciato.

GetProofToken(RequestSecurityToken, Scope)

Ottiene il token di prova da includere nella risposta (RSTR).

GetRequestorProofEncryptingCredentials(RequestSecurityToken)

Ottiene le credenziali di crittografia di prova del richiedente.

GetResponse(RequestSecurityToken, SecurityTokenDescriptor)

Crea la risposta (RSTR) che contiene il token emesso usando il descrittore di token di sicurezza e la richiesta (RST) specificati.

GetScope(ClaimsPrincipal, RequestSecurityToken)

Ottiene un Scope oggetto che contiene informazioni sulla relying party (RP) associata alla richiesta (RST) specificata. È necessario eseguire l'override di questo metodo nell'implementazione della SecurityTokenService classe .

GetSecurityTokenHandler(String)

Ottiene il gestore del token di sicurezza appropriato per l'emissione di un token di sicurezza del tipo specificato.

GetTokenLifetime(Lifetime)

Ottiene la durata del token emesso.

GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
Issue(ClaimsPrincipal, RequestSecurityToken)

Rilascia un token di sicurezza.

MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
Renew(ClaimsPrincipal, RequestSecurityToken)

Quando sottoposto a override in una classe derivata, elabora una richiesta di rinnovo WS-Trust.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)
Validate(ClaimsPrincipal, RequestSecurityToken)

Quando sottoposto a override in una classe derivata, elabora una richiesta di convalida WS-Trust.

ValidateRequest(RequestSecurityToken)

Convalida la richiesta del token di sicurezza (RST) incapsulata da questa istanza.

Si applica a

Vedi anche