SecurityTokenService Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Güvenlik belirteci hizmetinin (STS) özelliklerini ve yöntemlerini tanımlayan soyut temel sınıf.
public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
- Devralma
-
SecurityTokenService
Örnekler
Konu başlıklarında SecurityTokenService kullanılan kod örnekleri örnekten Custom Token
alınır. Bu örnek, Basit Web Belirteçlerinin (SWT) işlenmesini sağlayan özel sınıflar sağlar ve SWT belirtecini sunabilen pasif bir STS uygulamasını içerir. Etkin bir STS'nin nasıl uygulanabileceğine ilişkin bir örnek için örneği görebilirsiniz Federation Metadata
. Bu örnekler ve WIF için kullanılabilen diğer örnekler ve bunların nereden indirileceği hakkında bilgi için bkz. WIF Kod Örneği Dizini. Aşağıdaki kod, sınıfını kullanarak SecurityTokenService pasif sts uygulamasını gösterir.
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));
}
}
}
}
Aşağıdaki kodda, dosyasının arkasındaki koddan yöntemini çağırarak FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) bir WS-Federation isteğini işlemek için özel bir pasif STS'nin nasıl çağrıldığı gösterilmektedir 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 );
}
}
}
Açıklamalar
STS oluşturmak için sınıfından SecurityTokenService türetmelisiniz. Özel sınıfınızda, en azından ve GetOutputClaimsIdentity yöntemlerini geçersiz kılmanız GetScope gerekir. Bu geçersiz kılmalarla, sınıfında tanımlanan diğer tüm yöntemlerin varsayılan uygulaması kullanılarak oluşturulan STS, güvenlik belirteci isteklerine (RST) yanıt olarak güvenlik belirteçleri verme yeteneğine sahiptir. Yani, WS-Trust belirtiminde tanımlanan Sorun bağlaması uygulanır. Bu bağlama yönteminde Issue uygulanır. Diğer WS-Trust bağlamalarından hiçbiri (Yenileme, İptal ve Doğrulama) varsayılan durumda uygulanmaz ve bu bağlamalardan birine karşılık gelen bir RST ile karşılaşılırsa çağırana uygun bir hata döndürülür. Bu bağlamaları STS'nizde uygulamak için uygun yöntemleri (Renew, Cancelve Validate) geçersiz kılabilirsiniz.
Önemli
Üretime hazır bir STS'nin uygulanması, bu tür bir hizmetin ortaya çıkmasında ortaya çıkabilecek olası güvenlik risklerini azaltmak için dikkatli planlama ve önemli kaynaklar gerektirir. Windows Identity Foundation (WIF) kullanan geliştiricilerin çoğu, STS'nin kendisini geliştirmek yerine kimlik yönetimini sts'ye dış kaynak olarak kullanan uygulamalar geliştirecektir. WIF, geliştiricilerin geliştirme ortamındaki çözümleri test etmelerine yardımcı olmak için Visual Studio 2012 için Kimlik ve Erişim Aracı olan Visual Studio uzantısını sağlar. Bu araç, LocalSTS
geliştirmekte olduğunuz uygulamaya belirli talepler sunmak için yapılandırabileceğiniz bir STS içerir. Kimlik ve Erişim aracı hakkında daha fazla bilgi için bkz. Visual Studio 2012 için Kimlik ve Erişim Aracı. Bazı senaryolarda, LocalSTS
uygulamanızı yeterli şekilde test etmek için gereken işlevselliği sağlamayabilir; örneğin, bir uygulama tarafından kullanılmak üzere özel belirteç işleyicisi geliştirmeyi içeren bir senaryoda. Bu gibi durumlarda, geliştirme ortamınızda dağıtılabilir ve uygulamanızda bu tür özellikleri test etmek için kullanılabilen bir veya daha fazla basit STS oluşturmak için öğesini türetebilirsiniz SecurityTokenService . Bu bölümün geri kalanı, basit bir STS uygulamanıza ve belirteç verme işlem hattını genişletmenize olanak tanıyan sınıfı tarafından SecurityTokenService kullanıma sunulan yöntemlere odaklanır.
Aşağıdaki listede, bir test veya geliştirme ortamında kullanılmak üzere geliştirici için birincil öneme sahip yöntemlere kısa bir genel bakış sağlanmaktadır.
GetScope yöntemi. Bu yöntem, RP hakkında bilgi içeren bir Scope nesne döndürür. Bu nesne, belirteç verme işlem hattının geri kalanında kullanılır ve yanıtta kullanılacak imzalama ve şifreleme kimlik bilgilerinin yanı
AppliesTo
sıra veReplyTo
(gerekirse) adresleri hakkında bilgi içerir. Bu yöntemi geçersiz kılmanız gerekir.GetOutputClaimsIdentity yöntemi. Bu yöntem, RP'ye döndürülecek talepleri içeren bir ClaimsIdentity nesne döndürür. Bu yöntemi geçersiz kılmanız gerekir.
Issue yöntemi. Bu yöntem, gelen bir güvenlik belirteci isteğini (RST) işleyen ve çağırana RP ile kimlik doğrulaması yapmak için kullanılabilecek bir belirteç içeren bir yanıt (RSTR) döndüren belirteç isteği işlem hattını uygular. sınıfında tanımlanan SecurityTokenService diğer yöntemlerin çoğu ve GetOutputClaimsIdentity yöntemleri de dahil olmak üzere GetScope bu yöntemden çağrılır. Bu yöntemi geçersiz kılmanız gerekmez, ancak uyguladığı belirteç isteği işlem hattını anlamak yararlı olabilir.
STS sınıfı aracılığıyla SecurityTokenServiceConfiguration yapılandırılır.
Uygulayanlara Notlar
Hem hem GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) de GetScope(ClaimsPrincipal, RequestSecurityToken) yöntemlerini geçersiz kılmanız gerekir.
Oluşturucular
SecurityTokenService(SecurityTokenServiceConfiguration) |
Belirtilen yapılandırma ayarlarını kullanarak sınıfı başlatmak SecurityTokenService için türetilmiş sınıflardan çağrılır. |
Özellikler
Principal |
Geçerli örnekle ilişkili sorumluyu alır veya ayarlar. |
Request |
Geçerli örnekle ilişkili güvenlik belirteci isteğini (RST) alır veya ayarlar. |
Scope |
Geçerli örnekle ilişkili kapsamı alır veya ayarlar. |
SecurityTokenDescriptor |
Geçerli örnekle ilişkili öğesini SecurityTokenDescriptor alır veya ayarlar. |
SecurityTokenServiceConfiguration |
Sahip yapılandırma örneğini alır. |
Yöntemler
BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, zaman uyumsuz bir WS-Trust İptal isteği başlar. |
BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, yöntemine GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) zaman uyumsuz bir çağrı başlatır. |
BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, yöntemi için GetScope(ClaimsPrincipal, RequestSecurityToken) zaman uyumsuz bir çağrı başlatır. |
BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, zaman uyumsuz bir WS-Trust Sorun isteği başlar. |
BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, Yenileme isteğine zaman uyumsuz bir WS-Trust başlar. |
BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, Validate isteğini WS-Trust zaman uyumsuz bir şekilde başlar. |
Cancel(ClaimsPrincipal, RequestSecurityToken) |
Türetilmiş bir sınıfta geçersiz kılındığında, bir WS-Trust İptal isteği işler. |
CreateSecurityTokenDescriptor(RequestSecurityToken, Scope) |
bir örneğini SecurityTokenDescriptoroluşturur. |
EndCancel(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında, zaman uyumsuz WS-Trust İptal isteğini tamamlar. |
EndGetOutputClaimsIdentity(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında, yöntemine zaman uyumsuz çağrıyı BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) tamamlar. |
EndGetScope(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında, yöntemine zaman uyumsuz çağrıyı BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) tamamlar. |
EndIssue(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında, zaman uyumsuz WS-Trust Sorun isteğini tamamlar. |
EndRenew(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında Yenileme isteği WS-Trust zaman uyumsuz işlemi tamamlar. |
EndValidate(IAsyncResult) |
Türetilmiş bir sınıfta geçersiz kılındığında, Validate isteğini WS-Trust zaman uyumsuz işlemi tamamlar. |
Equals(Object) |
Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler. (Devralındığı yer: Object) |
GetHashCode() |
Varsayılan karma işlevi işlevi görür. (Devralındığı yer: Object) |
GetIssuerName() |
Güvenlik belirteci hizmetinin (STS) adını alır. |
GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) |
Türetilmiş bir sınıfta geçersiz kılındığında, bu yöntem verilen belirteçte dahil edilecek çıkış konularının bir koleksiyonunu döndürür. |
GetProofToken(RequestSecurityToken, Scope) |
Yanıta (RSTR) dahil edilecek kanıt belirtecini alır. |
GetRequestorProofEncryptingCredentials(RequestSecurityToken) |
İstek sahibinin kimlik bilgilerini şifreleyen kanıtı alır. |
GetResponse(RequestSecurityToken, SecurityTokenDescriptor) |
Belirtilen istek (RST) ve güvenlik belirteci tanımlayıcısını kullanarak verilen belirteci içeren yanıtı (RSTR) oluşturur. |
GetScope(ClaimsPrincipal, RequestSecurityToken) |
Belirtilen istekle (RST) ilişkili bağlı olan taraf (RP) hakkında bilgi içeren bir Scope nesnesi alır. Sınıfı uygulamanızda bu yöntemi geçersiz kılmanız SecurityTokenService gerekir. |
GetSecurityTokenHandler(String) |
Belirtilen türde bir güvenlik belirteci verme için uygun güvenlik belirteci işleyicisini alır. |
GetTokenLifetime(Lifetime) |
Verilen belirtecin ömrünü alır. |
GetType() |
Type Geçerli örneğini alır. (Devralındığı yer: Object) |
Issue(ClaimsPrincipal, RequestSecurityToken) |
Bir güvenlik belirteci verir. |
MemberwiseClone() |
Geçerli Objectöğesinin sığ bir kopyasını oluşturur. (Devralındığı yer: Object) |
Renew(ClaimsPrincipal, RequestSecurityToken) |
Türetilmiş bir sınıfta geçersiz kılındığında, WS-Trust Yenileme isteğini işler. |
ToString() |
Geçerli nesneyi temsil eden dizeyi döndürür. (Devralındığı yer: Object) |
Validate(ClaimsPrincipal, RequestSecurityToken) |
Türetilmiş bir sınıfta geçersiz kılındığında, WS-Trust Validate isteğini işler. |
ValidateRequest(RequestSecurityToken) |
Bu örnek tarafından kapsüllenen güvenlik belirteci isteğini (RST) doğrular. |