【问题标题】:Where to store data in WCF request在 WCF 请求中存储数据的位置
【发布时间】:2013-04-12 21:38:11
【问题描述】:

我正在为我的 WCF 安全性使用自定义用户名和密码验证。现在我想在请求期间存储用户名,以便稍后在调用的方法中访问它。我该怎么做?

一些示例代码来描述我的问题:

public class CustomUserValidator : UserNamePasswordValidator
{
    public override void Validate(string username, string password)
    {
        if (username == "aaa" && password == "bbb")
        {
            // store username where i can get it in method called later.
            return;
        }
        throw new SecurityTokenException("Unknown Username or Password");
    }
}

现在被调用的方法:

public void WebServiceMethod()
{
    Database.User.Single(c => c.Username == /* username from above */);
}

BR
安德烈亚斯

【问题讨论】:

  • 最简单的方法是将其存储在静态用户名属性中。更好的方法是编写自定义 WCF 行为。
  • @daryal 在各个层面都不好; a:WCF是多线程的,b:WCF可以在不同的点使用不同的线程(使得thread-static不可靠)
  • @MarcGravell 你在每个层面上都是对的:),但是为了回答这个问题,应该提供实例模式和并发模式。这就是为什么我提议写一个行为。
  • @daryal 为什么会有这样的行为? identity 在 WCF 中有一个得到很好支持的模型
  • @MarcGravell 使用主体的用户名是可以的。但在复杂的场景中,如果您需要一些相关参数,我认为最好采用自定义行为。考虑一种情况,wcf 调用标头具有需要在数据库中持久保存的标识符字段,并且相同的参数用于关联目的。

标签: c# wcf web-services session


【解决方案1】:

您通常会通过发出自定义“委托人”来做到这一点,这是通过IAuthorizationPolicy 完成的; IIRC,用户名通过评估上下文参数提供给 auth-policy。 WCF 中自定义主体的一般演练是here,但是您可能需要在Evaluate 中进行一些试验,以在评估上下文中找到传入的用户名。特别是,如果任何键是“声明”字典,请查看它。并查看评估上下文中的.Claims - 您应该CustomUserValidator 发布的带有用户名的“声明”中找到。

然而,我已经完全完成了您在之前的工作中描述的内容 - 并且 IIRC 运行良好,使用上面的页面作为我的起点。

一旦您发布了委托人,它将照常通过以下方式提供:

string cn = Thread.CurrentPrincipal.Identity.Name;

【讨论】:

    【解决方案2】:

    要通过单个 WCF 请求存储任何类型的数据,Darin Dimitrov 建议在此处将一个简单的 IExtension<> 助手类连接到当前的 OperationContextWhere to store data for current WCF call?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2015-12-13
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多