Поскольку пользовательский валидатор вызывается только один раз, хранилище InMemoryStore не требуется.Код ниже - это то, что мы используем, и он отлично работает в производстве.
public override void Validate(string userName, string password)
{
// validate arguments
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(password))
throw new ArgumentNullException("password");
using (DataAccessAdapter da = new DataAccessAdapter())
{
LinqMetaData db = new LinqMetaData(da);
var userCredential = (from u in db.User
where u.Username == userName
select new UserCredential
{
UserName = u.Username,
PasswordHash = u.PasswordHash,
PasswordSalt = u.PasswordSalt
}).FirstOrDefault();
if (userCredential == null)
{
throw new SecurityTokenException("Unknown username or password");
}
//Validate Password
PasswordHash p = new PasswordHash(userCredential.PasswordSalt, userCredential.PasswordHash);
if (!p.Verify(password))
{
throw new SecurityTokenException("Unknown username or password");
}
}
}
Как только вызов аутентифицирован, вы можете создать пользовательский принципал, используя следующее:
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
// get the authenticated client identity
IIdentity client = GetClientIdentity(evaluationContext);
// add roles etc
....
evaluationContext.Properties["Principal"] = new CustomPrincipal(client, roles.ToArray(), userId, email, client.Name);
return true;
}