代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

自定义用户名密码验证程序能否向WCF会话添加内容?

  •  2
  • Roger Lipscombe  · 技术社区  · 15 年前

    有关 this question ,我正在我的自定义用户名密码验证器中实例化与内部API的连接。我可以把它藏在某个地方,以便在将来的用户会话中使用它吗?

    这和 this question ,但我没有使用IIS,因此我不能使用httpContext.current(或者我可以吗?).

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

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

    2 回复  |  直到 11 年前
        1
  •  5
  •   Roger Lipscombe    11 年前

    是的,可以。你需要:

    • 风俗习惯 ServiceCredentials 返回自定义 SecurityTokenManager .
    • 风俗习惯 安全技术经理 返回自定义 CustomUserNameSecurityTokenAuthenticator .
    • 你习俗 自定义用户名安全身份验证程序 需要覆盖 ValidateUserNamePasswordCore ,并应添加自定义实现 IAuthorizationPolicy .
    • 你的实施 i授权政策 应该实施 Evaluate ,此时它可以开始将内容放入WCF上下文中。
    • 替换 evaluationContext["PrimaryIdentity"] 价值与A PasswordIdentity 或习俗 IIdentity .
    • 替换 evaluationContext["Principal"] 价值与A PasswordPrincipal 或习俗 IPrincipal .
    • 更新 evaluationContext["Identities"] 要替换的集合 GenericIdentity 使用自定义实例的实例。

    通过这样做,您可以有一个自定义 委托人 包含一些额外信息的实现。

    有关详细信息,请参阅 this .

        2
  •  0
  •   Ladislav Mrnka    15 年前

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

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