WCF - 为什么'CustomAuthorizationPolicy'在每个操作上都创建一个'CustomPrincipal'?

时间:2012-06-18 10:14:55

标签: wcf authorization wcf-authentication

我正在使用自定义的USERNAME-PASSWORD验证器开发WCF服务。

我有 CustomUserNameValidator ,它继承自 UserNamePasswordValidator

我还使用继承自 IAuthorizationPolicy CustomAuthorizationPolicy

自定义授权策略的 Evaluate 方法如下所示:

    // this method gets called after the authentication stage
    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        // get the authenticated client identity
        IIdentity client = GetClientIdentity(evaluationContext);

        // set the custom principal
        evaluationContext.Properties["Principal"] = new CustomPrincipal(client);

        return true;
    }

正如您所看到的 - 我在每次调用 Evaluate 时都会创建一个新的 CustomPrincipal 对象(在服务上调用的每个操作中都会完成)。

这是我的 CustomPrincipal 构造函数的样子:

    public CustomPrincipal(IIdentity identity)
    {
        IdentityObject = identity;
        GetUser(IdentityObject.Name);
        EnsureRoles();
    }

GetUser EnsureRoles 方法转到SQL数据库,检查用户的角色。

我的问题是 - 为什么每次操作都要发生这种情况?

为什么在每次操作时都会创建 CustomPrincipal ,而不仅仅是在客户端第一次连接到服务时?

对我来说,为什么对服务调用的每个操作都没有意义 - 'CustomPrincipal'将转到数据库并重新获取用户,以及他的所有角色... < / p>

[更新] 这就是我的查询服务界面:

[ServiceContract(Namespace = "http://www.my1fj.com/QueryService/2012/", SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IQueryService
{
     // Some operations
}

1 个答案:

答案 0 :(得分:1)

我希望您的服务是每次呼叫服务,并且在每次呼叫服务中,每次呼叫都会进行身份验证检查,但在每次会话服务的情况下,检查仅在会话开始时进行(如果安全协商已转为上)。

..来自here

每次都可以在服务中缓存它们,而不是点击数据库。

<强>更新

服务是每次调用/每个会话/单例由由服务类上应用的InstanceContextMode的{​​{1}}属性决定。

实施例

ServiceBehavior

要了解详情,请查看此post。 要详细了解[ServiceContract] interface IMyContract {...} [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] class MyService : IMyContract {...} 属性检查this