我正在为我的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
安德烈亚斯
答案 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<>
帮助程序类连接到此处的当前OperationContext
:Where to store data for current WCF call?