【问题标题】:Can a custom UserNamePasswordValidator add things to the WCF session?自定义 UserNamePasswordValidator 可以向 WCF 会话添加内容吗?
【发布时间】:2015-04-14 18:46:05
【问题描述】:

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

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

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

因为实例化 COM 对象和登录成本很高,所以我想在我的服务方法中重新使用现在登录的 COM 对象。

【问题讨论】:

    标签: wcf wcf-security


    【解决方案1】:

    是的,可以。你需要:

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

    通过这样做,您可以拥有一个自定义的IPrincipal 实现,其中包含一些额外的信息。

    更多详情请见this

    【讨论】:

      【解决方案2】:

      UserNamePasswordValidator 绝对不在所有 WCF 上下文中。它仅用于验证用户名和密码。你能进一步解释你的问题吗?

      编辑: 我猜 COM 对象是为每个会话实例化的,不是吗?否则将 COM 包装成单例应该可以解决您的问题。如果您需要在验证器和服务实例之间共享每个会话 COM 对象,您将需要一些缓存或注册表 - 位于验证器和服务之外并且可以从它们两者调用的东西。

      【讨论】:

      • 为了验证用户名和密码,我必须实例化一个昂贵的 COM 对象。由于我稍后会使用它,所以我想将它与会话相关联。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多