UserNameSecurityTokenAuthenticator 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
对 UserNameSecurityToken 安全令牌进行身份验证。
public ref class UserNameSecurityTokenAuthenticator abstract : System::IdentityModel::Selectors::SecurityTokenAuthenticator
public abstract class UserNameSecurityTokenAuthenticator : System.IdentityModel.Selectors.SecurityTokenAuthenticator
type UserNameSecurityTokenAuthenticator = class
inherit SecurityTokenAuthenticator
Public MustInherit Class UserNameSecurityTokenAuthenticator
Inherits SecurityTokenAuthenticator
- 继承
- 派生
示例
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.IdentityModel.Claims;
using System.IdentityModel.Policy;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Principal;
using System.ServiceModel.Security;
using System.Text.RegularExpressions;
namespace Microsoft.ServiceModel.Samples
{
class MyTokenAuthenticator : UserNameSecurityTokenAuthenticator
{
static bool IsRogueDomain(string domain)
{
return false;
}
static bool IsEmail(string inputEmail)
{
string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
Regex re = new Regex(strRegex);
if (re.IsMatch(inputEmail))
return (true);
else
return (false);
}
bool ValidateUserNameFormat(string UserName)
{
if (!IsEmail(UserName))
{
Console.WriteLine("Not a valid email");
return false;
}
string[] emailAddress = UserName.Split('@');
string user = emailAddress[0];
string domain = emailAddress[1];
if (IsRogueDomain(domain))
return false;
return true;
}
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password)
{
if (!ValidateUserNameFormat(userName))
throw new SecurityTokenValidationException("Incorrect UserName format");
ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty));
List<IIdentity> identities = new List<IIdentity>(1);
identities.Add(new GenericIdentity(userName));
List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1);
policies.Add(new UnconditionalPolicy(ClaimSet.System, claimSet, DateTime.MaxValue.ToUniversalTime(), identities));
return policies.AsReadOnly();
}
}
class UnconditionalPolicy : IAuthorizationPolicy
{
string id = Guid.NewGuid().ToString();
ClaimSet issuer;
ClaimSet issuance;
DateTime expirationTime;
IList<IIdentity> identities;
public UnconditionalPolicy(ClaimSet issuer, ClaimSet issuance, DateTime expirationTime, IList<IIdentity> identities)
{
if (issuer == null)
throw new ArgumentNullException("issuer");
if (issuance == null)
throw new ArgumentNullException("issuance");
this.issuer = issuer;
this.issuance = issuance;
this.identities = identities;
this.expirationTime = expirationTime;
}
public string Id
{
get { return this.id; }
}
public ClaimSet Issuer
{
get { return this.issuer; }
}
public DateTime ExpirationTime
{
get { return this.expirationTime; }
}
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
evaluationContext.AddClaimSet(this, this.issuance);
if (this.identities != null)
{
object value;
IList<IIdentity> contextIdentities;
if (!evaluationContext.Properties.TryGetValue("Identities", out value))
{
contextIdentities = new List<IIdentity>(this.identities.Count);
evaluationContext.Properties.Add("Identities", contextIdentities);
}
else
{
contextIdentities = value as IList<IIdentity>;
}
foreach (IIdentity identity in this.identities)
{
contextIdentities.Add(identity);
}
}
evaluationContext.RecordExpirationTime(this.expirationTime);
return true;
}
}
}
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Text
Imports System.IdentityModel.Claims
Imports System.IdentityModel.Policy
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens
Imports System.Security.Principal
Imports System.ServiceModel.Security
Imports System.Text.RegularExpressions
Class MyTokenAuthenticator
Inherits UserNameSecurityTokenAuthenticator
Shared Function IsRogueDomain(ByVal domain As String) As Boolean
Return False
End Function 'IsRogueDomain
Shared Function IsEmail(ByVal inputEmail As String) As Boolean
Dim strRegex As String = "^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" + "\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + ".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
Dim re As New Regex(strRegex)
If re.IsMatch(inputEmail) Then
Return True
Else
Return False
End If
End Function 'IsEmail
Function ValidateUserNameFormat(ByVal UserName As String) As Boolean
If Not IsEmail(UserName) Then
Console.WriteLine("Not a valid email")
Return False
End If
Dim emailAddress As String() = UserName.Split("@"c)
Dim user As String = emailAddress(0)
Dim domain As String = emailAddress(1)
If IsRogueDomain(domain) Then
Return False
End If
Return True
End Function
Protected Overrides Function ValidateUserNamePasswordCore(ByVal userName As String, ByVal password As String) As ReadOnlyCollection(Of IAuthorizationPolicy)
If Not ValidateUserNameFormat(userName) Then
Throw New SecurityTokenValidationException("Incorrect UserName format")
End If
Dim setOfClaims As New DefaultClaimSet(ClaimSet.System, New Claim(ClaimTypes.Name, userName, Rights.PossessProperty))
Dim identities As New List(Of IIdentity)(1)
identities.Add(New GenericIdentity(userName))
Dim policies As New List(Of IAuthorizationPolicy)(1)
policies.Add(New UnconditionalPolicy(ClaimSet.System, setOfClaims, DateTime.MaxValue.ToUniversalTime(), identities))
Return policies.AsReadOnly()
End Function 'New
End Class
Class UnconditionalPolicy
Implements IAuthorizationPolicy
Private idValue As String = Guid.NewGuid().ToString()
Private issuerValue As ClaimSet
Private issuance As ClaimSet
Private expirationTimeValue As DateTime
Private identities As IList(Of IIdentity)
Public Sub New(ByVal issuer As ClaimSet, ByVal issuance As ClaimSet, ByVal expirationTime As DateTime, ByVal identities As IList(Of IIdentity))
If issuer Is Nothing Then
Throw New ArgumentNullException("issuer")
End If
If issuance Is Nothing Then
Throw New ArgumentNullException("issuance")
End If
Me.issuerValue = issuer
Me.issuance = issuance
Me.identities = identities
Me.expirationTimeValue = expirationTime
End Sub
Public ReadOnly Property Id() As String Implements IAuthorizationPolicy.Id
Get
Return Me.idValue
End Get
End Property
Public ReadOnly Property Issuer() As ClaimSet Implements IAuthorizationPolicy.Issuer
Get
Return Me.issuerValue
End Get
End Property
Public ReadOnly Property ExpirationTime() As DateTime
Get
Return Me.expirationTimeValue
End Get
End Property
Public Function Evaluate(ByVal evalContext As evaluationContext, ByRef state As Object) As Boolean Implements IAuthorizationPolicy.Evaluate
evalContext.AddClaimSet(Me, Me.issuance)
If Not (Me.identities Is Nothing) Then
Dim value As Object = Nothing
Dim contextIdentities As IList(Of IIdentity)
If Not evalContext.Properties.TryGetValue("Identities", value) Then
contextIdentities = New List(Of IIdentity)(Me.identities.Count) '
evalContext.Properties.Add("Identities", contextIdentities)
Else
contextIdentities = CType(value, IList(Of IIdentity))
End If
Dim identity As IIdentity
For Each identity In Me.identities
contextIdentities.Add(identity)
Next identity
End If
evalContext.RecordExpirationTime(Me.expirationTimeValue)
Return True
End Function
End Class
注解
重写 UserNameSecurityTokenAuthenticator 类,以便根据用户名和密码对安全令牌进行身份验证。
Windows Communication Foundation 附带以下类,这些类支持对安全令牌进行身份验证 UserNameSecurityToken 。
类型 | 描述 |
---|---|
CustomUserNameSecurityTokenAuthenticator | 使应用程序可以为用户名和密码提供自定义身份验证方案。 身份验证方案是使用派生自 UserNamePasswordValidator 类的类提供的。 |
WindowsUserNameSecurityTokenAuthenticator | 将用户名和密码作为 Windows 帐户进行身份验证。 |
大多数自定义身份验证方案可以使用 CustomUserNameSecurityTokenAuthenticator 类和实现派生自 UserNamePasswordValidator 类的类。 但是,如果需要额外的灵活性,则可以从 UserNameSecurityTokenAuthenticator 类派生类并重写 ValidateUserNamePasswordCore 方法。
构造函数
UserNameSecurityTokenAuthenticator() |
初始化 UserNameSecurityTokenAuthenticator 类的新实例。 |
方法
CanValidateToken(SecurityToken) |
获取一个值,该值指示指定的安全令牌是否可由该安全令牌身份验证器进行验证。 (继承自 SecurityTokenAuthenticator) |
CanValidateTokenCore(SecurityToken) |
获取一个值,该值指示指定的安全令牌是否可由该安全令牌身份验证器进行验证。 |
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |
ValidateToken(SecurityToken) |
对指定的安全令牌进行身份验证,并返回该安全令牌的授权策略集。 (继承自 SecurityTokenAuthenticator) |
ValidateTokenCore(SecurityToken) |
对指定的安全令牌进行身份验证,并返回该安全令牌的授权策略集。 |
ValidateUserNamePasswordCore(String, String) |
如果在派生类中重写,则对指定的用户名和密码进行身份验证,并且返回 UserNameSecurityToken 安全令牌的授权策略集。 |