Однажды я попытался сохранить пароль вместе с именем пользователя в PrimaryIdentity. Чтобы достичь этого, нам нужно предоставить новый UserNameSecurityTokenAuthenticator, который будет аутентифицировать имя пользователя и пароль, а затем может сохранить его в Identity, а затем он сохранит Identity в SecurityContext WCF.
Шаги, чтобы сделать
Классы
1.) Тестсервисхост: сервисхост
2.) UserNamePasswordSecurityTokenManager : ServiceCredentialsSecurityTokenManager
3.) TestUserNameSecurityTokenAuthenticator: UserNameSecurityTokenAuthenticator
4.) MyIdentity : IIdentity
5.) MyAuthorizatoinPolicy : IAuthorizationPolicy
1.) Создайте новый класс ServiceHost TestServiceHost
2.) В TestServiceHost переопределить OnOpening и предоставить новый класс UserNamePasswordServiceCredentials.
protected override void OnOpening()
{
base.OnOpening();
this.Description.Behaviors.Add(new UserNamePasswordServiceCredentials());
}
3.) Затем в UserNamePasswordServiceCredentials укажите новый UserNamePasswordSecurityTokenManager.
public override SecurityTokenManager CreateSecurityTokenManager()
{
return new UserNamePasswordSecurityTokenManager(this);
}
4.) Затем в UserNamePasswordSecurityTokenManager укажите новый TestUserNameSecurityTokenAuthenticator.
public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
if (tokenRequirement.TokenType == SecurityTokenTypes.UserName)
{
outOfBandTokenResolver = null;
return new TestUserNameSecurityTokenAuthenticator();
}
return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
}
5.) Затем внутри TestUserNameSecurityTokenAuthenticator вы можете аутентифицировать имя пользователя и пароль и можете создать свою собственную личность. В этой функции вы вернете список политик IAuthorization для оценки. Я создал свою собственную Политику авторизации и передал ей свою новую личность, чтобы установить Идентификацию в контексте.
protected override System.Collections.ObjectModel.ReadOnlyCollection<System.IdentityModel.Policy.IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password)
{
ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty));
List<IIdentity> identities = new List<IIdentity>(1);
identities.Add(new MyIdentity(userName,password));
List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1);
policies.Add(new MyAuthorizationPolicy(ClaimSet.System, identities));
return policies.AsReadOnly();
}
public class MyAuthorizationPolicy : IAuthorizationPolicy
{
String id = Guid.NewGuid().ToString();
ClaimSet issuer;
private IList<IIdentity> identities;
#region IAuthorizationPolicy Members
public MyAuthorizationPolicy(ClaimSet issuer, IList<IIdentity> identities)
{
if (issuer == null)
throw new ArgumentNullException("issuer");
this.issuer = issuer;
this.identities = identities;
}
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
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);
}
}
return true;
}
public ClaimSet Issuer
{
get { return this.issuer; }
}
#endregion
#region IAuthorizationComponent Members
public string Id
{
get { return this.id; }
}
#endregion
}
Итак, этот пример показывает, как вы можете переопределить безопасность в WCF:
Теперь в вашей проблеме:
1.) Внедрите эту технику и установите имя пользователя и пароль в своей личности. Теперь, когда вы когда-либо вызывали дочернюю службу, получите Identity, извлеките из нее имя пользователя и пароль и перейдите к дочерней службе.
2.) Аутентифицируйте имя пользователя и пароль и создайте для этого токен (для этого следует создать новую службу токенов). Сохраните этот токен в своем удостоверении вместе с именем пользователя и передайте эти два своим дочерним службам. Теперь, чтобы этот подход работал, дочерняя служба должна проверить ваш новый сгенерированный токен, для чего у вас должна быть служба токенов, которая может создавать токен, проверяя имя пользователя и пароль, а также которая может проверять токен вместе с именем пользователя.
Лично я бы выбрал подход 2, но он приведет к новым накладным расходам.
person
Nitin Midha
schedule
16.03.2010