Однажды я попытался сохранить пароль вместе с именем пользователя в PrimaryIdentity.
Для достижения этой цели нам нужно предоставить новый UserNameSecurityTokenAuthenticator, который будет аутентифицировать UserName и пароль, а затем сохранится в Identity, а затем сохранит Identity в SecurityContext из WCF.
шаги к выполнению
Классы
1.) TestServiceHost: ServiceHost
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 вы можете аутентифицировать UseraName и пароль и создать свою собственную личность. В этой функции вы вернете список политик 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
}
Итак, этот пример показывает, как вы можете переопределить Security в WCF:
Теперь в вашей проблеме:
1.) Реализуйте эту технику и задайте имя пользователя и пароль в своей личности. Теперь, когда вы когда-либо звоните в детскую службу, получите из нее имя пользователя и пароль для Identity и перейдите в детскую службу.
2.) Аутентифицируйте UserName и Password и сгенерируйте токен для этого (должен создать новый сервис токенов для этого). Сохраните этот токен в своей личности вместе с именем пользователя и передайте эти два в ваши детские службы. Теперь, чтобы этот подход работал, дочерняя служба должна проверить ваш новый сгенерированный токен, для которого у вас должна быть служба токенов, которая может создавать токен путем проверки имени пользователя и пароля, а также может проверять токен вместе с именем пользователя.
Лично я бы пошел на подход 2, но он привнесет новые накладные расходы.