gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:22:41 31 4
gpt4 key购买 nike

我正在开发一个带有自定义 USERNAME-PASSWORD 验证器的 WCF 服务。

我有一个继承自 UserNamePasswordValidator 的 CustomUserNameValidator。

我还使用从 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”将进入数据库并重新获取用户,以及他的所有角色......

[更新]
这是我的查询服务界面的样子:
[ServiceContract(Namespace = "http://www.my1fj.com/QueryService/2012/", SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IQueryService
{
// Some operations
}

最佳答案

我希望您的服务是按调用服务,并且在按调用服务中,每次调用都会进行身份验证检查,但对于按 session 服务,检查仅在 session 开始时进行(如果打开了安全协商)。

..来自 here

而不是每次都可以在服务中缓存它们时访问数据库。

更新:

服务是每次调用/每次 session /单例由 InstanceContextMode 决定ServiceBehavior 的属性(property)应用于服务类。

前任。

[ServiceContract]
interface IMyContract {...}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract {...}

要了解更多信息,请查看 post .
了解更多 InstanceContextMode查房 this .

关于WCF - 为什么 'CustomAuthorizationPolicy' 在每个操作上都会创建一个 'CustomPrincipal'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11080811/

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