我有一个WCF服务,我在其中使用customUserNamePasswordValidatorType(在web.config文件的behaviors \ serviceBehaviors \ serviceCredentials \ userNameAuthentication部分中指定)。
我的自定义UserNamePasswordValidator以这种方式工作:
public bool Authenticate(string userName, string password)
{
If ( IsUserValid(username, password) )
{
UserInfo currentUser = CreateUserInfo(username);
//
// Here I'd like to store the currentUser object somewhere so that
// it can be used during the service method execution
//
return true;
}
return false;
}
在服务呼叫执行期间,我需要访问经过身份验证的用户的信息。例如,我希望能够实现:
public class MyService : IService
{
public string Service1()
{
//
// Here I'd like to retrieve the currentUser object and use it
//
return "Hello" + currentUser.Name;
}
}
我的问题是在身份验证过程中如何以及在何处存储信息,以便在呼叫执行过程中可以访问它?只要“会话”有效,该存储应该持续。
顺便说一下,我不使用(也不想使用)安全会话和/或可靠会话。所以我关闭了establishSecuritytContext和reliableSessions。
我正在考虑启用ASP.NET兼容模式以将用户信息存储在HttpContext.Current.Session中,但我觉得不应该如何完成。
答案 0 :(得分:2)
将任何需要持久存储的内容存储到持久性存储中 - 例如数据库,这是最好的方式。
将用户信息存储在用户表中,例如ASP.NET会员系统或您自己的东西。保留某种识别令牌(用户名,ID等),以便在需要时从数据库中检索该信息。
您应该尽可能地努力获得无状态WCF服务 - 除了安全存储在数据库中的“状态”之外,它应该永远不依赖于任何类型的“状态”。