可以将自定义UserNamePasswordValidator添加到WCF会话中吗?

Rog*_*mbe 2 wcf wcf-security

此问题相关,我正在自定义UserNamePasswordValidator中实例化与内部API的连接。我可以将其存储在某个地方,以便将来在该用户会话中使用时使用吗?

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

更新:一些上下文:我们的内部API通过COM对象公开,该COM对象公开了一个Login方法。Login我没有在服务界面中使用方法,而是有了一个custom UserNamePasswordValidator,它在COM对象上调用Login方法。

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

Rog*_*mbe 5

是的,它可以。你需要:

  • ServiceCredentials返回定制的定制实现SecurityTokenManager
  • SecurityTokenManager返回定制的定制实现CustomUserNameSecurityTokenAuthenticator
  • 您的自定义CustomUserNameSecurityTokenAuthenticator需要覆盖ValidateUserNamePasswordCore,并应添加的自定义实现IAuthorizationPolicy
  • 您的实现IAuthorizationPolicy应该实现Evaluate,这时它可以开始将事情放到WCF上下文中。
  • evaluationContext["PrimaryIdentity"]用a PasswordIdentity或custom 替换值IIdentity
  • evaluationContext["Principal"]用a PasswordPrincipal或custom 替换值IPrincipal
  • 更新evaluationContext["Identities"]集合以将GenericIdentity实例替换为您的自定义实例。

这样,您可以拥有一个自定义IPrincipal实现,其中包含一些其他信息。

有关更多详细信息,请参阅