SecurityTokenService Kelas

Definisi

Kelas dasar abstrak yang menentukan properti dan metode layanan token keamanan (STS).

public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
Warisan
SecurityTokenService

Contoh

Contoh kode yang digunakan dalam SecurityTokenService topik diambil dari Custom Token sampel. Sampel ini menyediakan kelas kustom yang memungkinkan pemrosesan Simple Web Tokens (SWT) dan mencakup implementasi STS pasif yang mampu melayani token SWT. Untuk contoh cara menerapkan STS aktif, Anda dapat melihat sampelnya Federation Metadata . Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tentang tempat mengunduhnya, lihat Indeks Sampel Kode WIF. Kode berikut menunjukkan implementasi STS pasif menggunakan SecurityTokenService kelas .

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

    }
}

Kode berikut menunjukkan cara memanggil STS pasif kustom untuk memproses permintaan WS-Federation dengan memanggil FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) metode dari kode di belakang dalam 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 );
        }
    }
}

Keterangan

Untuk membuat STS, Anda harus berasal dari SecurityTokenService kelas . Di kelas kustom Anda, Anda harus, minimal, mengambil alih GetScope metode dan GetOutputClaimsIdentity . Dengan penimpaan ini, STS yang dibuat menggunakan implementasi default dari semua metode lain yang ditentukan di kelas mampu mengeluarkan token keamanan sebagai respons terhadap permintaan token keamanan (RST). Artinya, pengikatan Masalah yang ditentukan dalam spesifikasi WS-Trust diimplementasikan. Pengikatan ini diimplementasikan dalam Issue metode . Tidak ada pengikatan WS-Trust lainnya (Perpanjang, Batal, dan Validasi) yang diimplementasikan dalam kasus default dan kesalahan yang sesuai dikembalikan ke pemanggil jika RST yang sesuai dengan salah satu pengikatan ini ditemui. Anda tentu saja dapat mengambil alih metode yang sesuai (Renew, , Canceldan Validate) untuk mengimplementasikan pengikatan ini di STS Anda.

Penting

Menerapkan STS siap produksi memerlukan perencanaan yang cermat dan sumber daya yang cukup besar untuk mengurangi potensi risiko keamanan yang melekat dalam mengekspos layanan tersebut. Sebagian besar pengembang yang menggunakan Windows Identity Foundation (WIF) akan mengembangkan aplikasi yang melakukan outsourcing manajemen identitas ke STS, daripada mengembangkan STS itu sendiri. WIF menyediakan ekstensi Visual Studio, Alat Identitas dan Akses untuk Visual Studio 2012, untuk membantu pengembang menguji solusi di lingkungan pengembangan. Alat ini mencakup STS, LocalSTS, yang dapat Anda konfigurasi untuk melayani klaim tertentu ke aplikasi yang Anda kembangkan. Untuk informasi selengkapnya tentang alat Identitas dan Akses, lihat Alat Identitas dan Akses untuk Visual Studio 2012. Dalam beberapa skenario, LocalSTS mungkin tidak menyediakan fungsionalitas yang diperlukan untuk menguji aplikasi Anda secara memadai; misalnya, dalam skenario yang melibatkan pengembangan penangan token kustom untuk digunakan oleh aplikasi. Dalam kasus ini, Anda dapat memperoleh dari SecurityTokenService untuk membuat satu atau beberapa STS sederhana yang dapat disebarkan di lingkungan pengembangan Anda dan yang dapat digunakan untuk menguji fitur tersebut di aplikasi Anda. Bagian lainnya berfokus pada metode yang diekspos oleh SecurityTokenService kelas yang memungkinkan Anda menerapkan STS sederhana dan memperluas alur penerbitan token.

Daftar berikut ini memberikan gambaran singkat tentang metode kepentingan utama bagi pengembang untuk digunakan dalam lingkungan pengujian atau pengembangan.

  • Metode GetScope. Metode ini mengembalikan Scope objek yang berisi informasi tentang RP. Objek ini digunakan di sisa alur penerbitan token dan mencakup informasi tentang kredensial penandatanganan dan enkripsi yang akan digunakan dalam respons, serta AppliesTo alamat dan ReplyTo (jika diperlukan). Anda harus mengambil alih metode ini.

  • Metode GetOutputClaimsIdentity. Metode ini mengembalikan ClaimsIdentity objek yang berisi klaim untuk kembali ke RP. Anda harus mengambil alih metode ini.

  • Metode Issue. Metode ini mengimplementasikan alur permintaan token, yang memproses permintaan token keamanan masuk (RST) dan mengembalikan respons (RSTR) ke pemanggil yang berisi token yang dapat digunakan untuk mengautentikasi dengan RP. Banyak metode lain yang ditentukan dalam kelas dipanggil SecurityTokenService dari metode ini, termasuk GetScope metode dan GetOutputClaimsIdentity . Anda tidak perlu mengambil alih metode ini, tetapi pemahaman tentang alur permintaan token yang diterapkannya mungkin berguna.

STS dikonfigurasi melalui SecurityTokenServiceConfiguration kelas .

Catatan Bagi Implementer

Anda harus mengambil alih metode GetScope(ClaimsPrincipal, RequestSecurityToken) dan GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) .

Konstruktor

SecurityTokenService(SecurityTokenServiceConfiguration)

Dipanggil dari kelas turunan untuk menginisialisasi SecurityTokenService kelas menggunakan pengaturan konfigurasi yang ditentukan.

Properti

Principal

Mendapatkan atau mengatur prinsipal yang terkait dengan instans saat ini.

Request

Mendapatkan atau mengatur permintaan token keamanan (RST) yang terkait dengan instans saat ini.

Scope

Mendapatkan atau mengatur cakupan yang terkait dengan instans saat ini.

SecurityTokenDescriptor

Mendapatkan atau mengatur yang SecurityTokenDescriptor terkait dengan instans saat ini.

SecurityTokenServiceConfiguration

Mendapatkan instans konfigurasi pemilik.

Metode

BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Saat ditimpa di kelas turunan, memulai permintaan pembatalan WS-Trust asinkron.

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

Ketika ditimpa di kelas turunan, memulai panggilan asinkron ke GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) metode .

BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Ketika ditimpa di kelas turunan, memulai panggilan asinkron untuk metode tersebut GetScope(ClaimsPrincipal, RequestSecurityToken) .

BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Saat ditimpa di kelas turunan, memulai permintaan Masalah WS-Trust asinkron.

BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Saat ditimpa di kelas turunan, memulai permintaan perpanjangan WS-Trust asinkron.

BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

Saat ditimpa di kelas turunan, memulai permintaan Validasi WS-Trust asinkron.

Cancel(ClaimsPrincipal, RequestSecurityToken)

Saat ditimpa di kelas turunan, memproses permintaan WS-Trust Batalkan.

CreateSecurityTokenDescriptor(RequestSecurityToken, Scope)

Membuat instans dari SecurityTokenDescriptor.

EndCancel(IAsyncResult)

Saat ditimpa di kelas turunan, menyelesaikan permintaan batal WS-Trust asinkron.

EndGetOutputClaimsIdentity(IAsyncResult)

Ketika ditimpa di kelas turunan, menyelesaikan panggilan asinkron ke BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) metode .

EndGetScope(IAsyncResult)

Ketika ditimpa di kelas turunan, menyelesaikan panggilan asinkron ke BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) metode .

EndIssue(IAsyncResult)

Saat ditimpa di kelas turunan, menyelesaikan permintaan Masalah WS-Trust asinkron.

EndRenew(IAsyncResult)

Saat ditimpa di kelas turunan, menyelesaikan permintaan Perpanjangan WS-Trust asinkron.

EndValidate(IAsyncResult)

Saat ditimpa di kelas turunan, menyelesaikan permintaan Validasi WS-Trust asinkron.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetIssuerName()

Mendapatkan nama layanan token keamanan (STS).

GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope)

Ketika ditimpa di kelas turunan, metode ini mengembalikan kumpulan subjek output yang akan disertakan dalam token yang dikeluarkan.

GetProofToken(RequestSecurityToken, Scope)

Mendapatkan token bukti yang akan disertakan dalam respons (RSTR).

GetRequestorProofEncryptingCredentials(RequestSecurityToken)

Mendapatkan kredensial enkripsi bukti pemohon.

GetResponse(RequestSecurityToken, SecurityTokenDescriptor)

Membuat respons (RSTR) yang berisi token yang dikeluarkan dengan menggunakan permintaan yang ditentukan (RST) dan deskriptor token keamanan.

GetScope(ClaimsPrincipal, RequestSecurityToken)

Scope Mendapatkan objek yang berisi informasi tentang pihak yang mengandalkan (RP) yang terkait dengan permintaan yang ditentukan (RST). Anda harus mengambil alih metode ini dalam implementasi SecurityTokenService kelas Anda.

GetSecurityTokenHandler(String)

Mendapatkan handler token keamanan yang sesuai untuk mengeluarkan token keamanan dari jenis yang ditentukan.

GetTokenLifetime(Lifetime)

Mendapatkan masa pakai untuk token yang dikeluarkan.

GetType()

Mendapatkan instans Type saat ini.

(Diperoleh dari Object)
Issue(ClaimsPrincipal, RequestSecurityToken)

Mengeluarkan token keamanan.

MemberwiseClone()

Membuat salinan dangkal dari yang saat ini Object.

(Diperoleh dari Object)
Renew(ClaimsPrincipal, RequestSecurityToken)

Saat ditimpa di kelas turunan, memproses permintaan WS-Trust Perpanjang.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)
Validate(ClaimsPrincipal, RequestSecurityToken)

Saat ditimpa di kelas turunan, memproses permintaan validasi WS-Trust.

ValidateRequest(RequestSecurityToken)

Memvalidasi permintaan token keamanan (RST) yang dienkapsulasi oleh instans ini.

Berlaku untuk

Lihat juga