我正在使用自定义的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
}
答案 0 :(得分:1)
我希望您的服务是每次呼叫服务,并且在每次呼叫服务中,每次呼叫都会进行身份验证检查,但在每次会话服务的情况下,检查仅在会话开始时进行(如果安全协商已转为上)。
..来自here
每次都可以在服务中缓存它们,而不是点击数据库。
<强>更新强>
服务是每次调用/每个会话/单例由由服务类上应用的InstanceContextMode
的{{1}}属性决定。
实施例
ServiceBehavior
要了解详情,请查看此post。
要详细了解[ServiceContract]
interface IMyContract {...}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract {...}
属性检查this。