SecurityTokenService Класс

Определение

Абстрактный базовый класс, определяющий свойства и методы службы маркеров безопасности (STS).

public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
Наследование
SecurityTokenService

Примеры

Примеры кода, используемые в SecurityTokenService разделах, взяты из Custom Token примера. В этом примере представлены пользовательские классы, которые позволяют обрабатывать простые веб-токены (SWT) и включают реализацию пассивной службы STS, которая может служить маркером SWT. Пример реализации активной службы STS см. в Federation Metadata примере. Сведения об этих примерах и других примерах, доступных для WIF и о том, где их скачать, см. в разделе "Пример кода WIF". В следующем коде показана реализация пассивной службы безопасности с помощью 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));
            }
        }

    }
}

В следующем коде показано, как вызвать пользовательскую пассивную службу безопасности для обработки запроса 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). То есть привязка проблемы, определенная в спецификации WS-Trust, реализована. Эта привязка реализуется в методе Issue . Ни одна из других WS-Trust привязок (продление, отмена и проверка) не реализована в случае по умолчанию, а соответствующая ошибка возвращается вызывающему объекту, если обнаружен RST, соответствующий одной из этих привязок. Вы можете, конечно, переопределить соответствующие методы (Renew, Cancelи Validate) для реализации этих привязок в stS.

Important

Реализация готовых к работе служб безопасности подразумевает тщательное планирование и значительные ресурсы для устранения потенциальных рисков безопасности, присущих раскрытию такой службы. Большинство разработчиков, использующих Windows Identity Foundation (WIF), будут разрабатывать приложения, которые аутсорсинг управления удостоверениями в stS, а не разработку самой службы STS. WIF предоставляет расширение Visual Studio, средство идентификации и доступа для Visual Studio 2012 года, чтобы помочь разработчикам тестировать решения в среде разработки. Это средство включает службу STS, LocalSTSкоторую можно настроить для обслуживания конкретных утверждений для разрабатываемого приложения. Дополнительные сведения о средстве удостоверений и доступа см. в статье Identity and Access Tool для Visual Studio 2012. В некоторых сценариях может не предоставлять функциональные возможности, необходимые для адекватного тестирования приложения. Например, LocalSTS в сценарии, в котором предполагается разработка пользовательского обработчика маркеров для использования приложением. В таких случаях можно создать SecurityTokenService одну или несколько простых stS, которые можно развернуть в среде разработки и использовать для тестирования таких функций в приложении. В остальной части этого раздела рассматриваются методы, предоставляемые классом SecurityTokenService , которые позволяют реализовать простую stS и расширить конвейер выдачи маркеров.

В следующем списке представлен краткий обзор методов основной важности для разработчика для использования в тестовой или среде разработки.

  • Метод GetScope. Этот метод возвращает Scope объект, содержащий сведения о RP. Этот объект используется в остальной части конвейера выдачи маркеров и содержит сведения о подписи и шифровании учетных данных для использования в ответе, а также AppliesToReplyTo (при необходимости) адресов. Этот метод необходимо переопределить.

  • Метод GetOutputClaimsIdentity. Этот метод возвращает ClaimsIdentity объект, содержащий утверждения, возвращаемые в RP. Этот метод необходимо переопределить.

  • Метод Issue. Этот метод реализует конвейер запроса маркера, который обрабатывает входящий запрос маркера безопасности (RST) и возвращает ответ (RSTR) вызывающей программе, содержащей маркер, который может использоваться для проверки подлинности с помощью RP. Многие другие методы, определенные в 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 Отмена.

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 проблемы.

BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

При переопределении в производном классе начинает асинхронный WS-Trust запрос на продление.

BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

При переопределении в производном классе начинает асинхронный запрос WS-Trust Validate.

Cancel(ClaimsPrincipal, RequestSecurityToken)

При переопределении в производном классе обрабатывает запрос WS-Trust Cancel.

CreateSecurityTokenDescriptor(RequestSecurityToken, Scope)

Создает экземпляр объекта SecurityTokenDescriptor.

EndCancel(IAsyncResult)

При переопределении в производном классе завершает асинхронный WS-Trust запрос отмены.

EndGetOutputClaimsIdentity(IAsyncResult)

При переопределении в производном классе завершает асинхронный вызов BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) метода.

EndGetScope(IAsyncResult)

При переопределении в производном классе завершает асинхронный вызов BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) метода.

EndIssue(IAsyncResult)

При переопределении в производном классе завершает асинхронный запрос WS-Trust проблемы.

EndRenew(IAsyncResult)

При переопределении в производном классе завершает асинхронный WS-Trust запрос на продление.

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.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
Validate(ClaimsPrincipal, RequestSecurityToken)

При переопределении в производном классе обрабатывает запрос WS-Trust Validate.

ValidateRequest(RequestSecurityToken)

Проверяет запрос маркера безопасности (RST), инкапсулированный этим экземпляром.

Применяется к

См. также раздел