gpt4 book ai didi

c# - WCF 自定义验证器 : How to initialize a "User" object from custom validator

转载 作者:太空狗 更新时间:2023-10-29 23:11:36 24 4
gpt4 key购买 nike

我有一个工作的自定义 UserNamePasswordValidator 调用我的 Oracle 数据库。

此类派生自 System.IdentityModel.Selectors.UserNamePasswordValidator 并且 Validate() 方法返回 void。

我从数据库加载我的用户对象,一旦密码通过验证,我想存储我的“用户”对象,以便服务在开展业务时可以访问它。在 ASP.NET/Java 领域,我会将它存储到一个 session 中,或者可能是我的整个 Controller 类。我如何从 WCF 中的验证器执行此操作?

或者,换句话说,WCF 领域中为服务设置自定义用户域对象的最佳实践是什么。

更新:这就是我解决它的方法。我在验证器期间缓存 User 对象,然后在 AuthorizatinPolicy 步骤中访问它。

  // this gets called after the custom authentication step where we loaded the User
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
// get the authenticated client identity
IIdentity client = GetClientIdentity(evaluationContext);

User user;
OraclePasswordValidator.users.TryGetValue(client.Name, out user);
if(user != null) {
// set the custom principal
evaluationContext.Properties["Principal"] = user;
return true;
}

return false;
}

最佳答案

我不是 WCF 专家,但根据我到目前为止所阅读和实现的内容,执行此操作的“正确”方法是使用 Validatorauthenticate 用户,然后实现 IAuthorizationPolicy 来执行实际的授权。因此,您将在当前线程上设置自定义主体的授权策略中。

为了能够转发来自用户名/密码验证的信息,您可以实现一个继承自 UserNameSecurityTokenAuthenticator 的安全 token 验证器。 SecurityTokenAuthenticator 将首先调用验证器,如果验证成功,它可以添加您的自定义授权策略并通过构造函数将用户信息发送到策略。长此以往:

public class CustomUsernameSecurityTokenAuthenticator : UserNameSecurityTokenAuthenticator
{
protected override bool CanValidateTokenCore(System.IdentityModel.Tokens.SecurityToken token)
{
return (token is UserNameSecurityToken);
}

protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token)
{
var authorizationPolicies = new List<IAuthorizationPolicy>();

try
{
var userNameToken = token as UserNameSecurityToken;
new CustomUserNameValidator().Validate(userNameToken.UserName, userNameToken.Password);

var claims = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userNameToken.UserName, Rights.PossessProperty));

authorizationPolicies.Add(new CustomAuthorizationPolicy(claims));
}
catch (Exception)
{
authorizationPolicies.Add(new InvalidAuthorizationPolicy());
throw;
}
return authorizationPolicies.AsReadOnly();
}
}

这里有一篇文章更多地描述了所涉及的类; http://blogs.msdn.com/card/archive/2007/10/04/how-identity-providers-can-show-custom-error-messages-in-cardspace.aspx

关于c# - WCF 自定义验证器 : How to initialize a "User" object from custom validator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2298620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com