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), инкапсулированный данным экземпляром.

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

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