在WCF请求中存储数据的位置

时间:2012-04-25 11:51:16

标签: c# wcf web-services session

我正在为我的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
安德烈亚斯

2 个答案:

答案 0 :(得分:3)

您通常会通过发出自定义“主体”来执行此操作,该主体通过IAuthorizationPolicy完成; IIRC,用户名通过evaluation-context参数提供给auth-policy。 WCF中自定义主体的常规演练为here,但您可能需要在Evaluate中进行一些实验,以在评估上下文中查找传入的用户名。特别是,如果任何键是“声明”字典,请查看它。并查看评估上下文中的.Claims - 您在其CustomUserValidator发布的“用户名”中找到“声明”。

然而,我已经完成了完全你在之前的工作中所描述的内容 - 而IIRC工作得很好,使用上面的页面作为我的起点。

一旦您发出了委托人,它将照常提供,通过:

string cn = Thread.CurrentPrincipal.Identity.Name;

答案 1 :(得分:0)

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