自定义UserNamePasswordValidator可以向WCF会话添加内容吗?

时间:2010-08-24 08:56:40

标签: wcf wcf-security

this question相关,我在我的自定义UserNamePasswordValidator中实例化与内部API的连接。我可以将它存放在某个地方,以便我可以在以后的用户会话中使用它吗?

这类似于this question,但我没有使用IIS,所以我不能使用HttpContext.Current(或者我可以吗?)。

更新:某些上下文:我们的内部API通过COM对象公开,该公开了Login方法。我没有在服务接口中使用Login方法,而是使用自定义UserNamePasswordValidator,它在COM对象上调用Login方法。

因为实例化COM对象并登录是很昂贵的,所以我想在我的服务方法中重用现在登录的COM对象。

2 个答案:

答案 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对象,则需要一些缓存或注册表 - 这些都在验证器和服务之外,并且可以从它们两者中调用。