与this question相关,我在我的自定义UserNamePasswordValidator中实例化与内部API的连接。我可以将它存放在某个地方,以便我可以在以后的用户会话中使用它吗?
这类似于this question,但我没有使用IIS,所以我不能使用HttpContext.Current(或者我可以吗?)。
更新:某些上下文:我们的内部API通过COM对象公开,该公开了Login
方法。我没有在服务接口中使用Login
方法,而是使用自定义UserNamePasswordValidator
,它在COM对象上调用Login方法。
因为实例化COM对象并登录是很昂贵的,所以我想在我的服务方法中重用现在登录的COM对象。
答案 0 :(得分:5)
是的,它可以。你需要:
ServiceCredentials
实施,返回自定义SecurityTokenManager
。SecurityTokenManager
实施,返回自定义CustomUserNameSecurityTokenAuthenticator
。CustomUserNameSecurityTokenAuthenticator
需要覆盖ValidateUserNamePasswordCore
,并应添加IAuthorizationPolicy
的自定义实施。IAuthorizationPolicy
实现应该实现Evaluate
,此时它可以开始将内容放在WCF上下文中。evaluationContext["PrimaryIdentity"]
值替换为PasswordIdentity
或自定义IIdentity
。evaluationContext["Principal"]
值替换为PasswordPrincipal
或自定义IPrincipal
。evaluationContext["Identities"]
集合,将GenericIdentity
实例替换为您的自定义实例。通过这样做,您可以拥有一个自定义IPrincipal
实现,其中包含一些额外信息。
有关详细信息,请参阅this。
答案 1 :(得分:0)
UserNamePasswordValidator绝对不在所有WCF上下文中。它仅用于验证用户名和密码。你能进一步解释你的问题吗?
修改强> 我猜COM对象是为每个会话实例化的,不是吗?否则将COM包装成单例可以解决您的问题。如果您需要在验证器和服务实例之间共享每个会话COM对象,则需要一些缓存或注册表 - 这些都在验证器和服务之外,并且可以从它们两者中调用。