Sec*_*rel 10 asp.net wcf web-services
背景
我有一个与WCF服务交互的ASP.NET Web应用程序.Web应用程序和WCF服务由我控制.ASP.NET Web应用程序使用ASP.NET成员资格提供程序模型的自定义实现(密码以散列形式存储)来验证登录Web应用程序的用户.ASP.NET Web应用程序和WCF服务都可以访问相同的成员资格数据库.
由于用户只提供一次密码,我不想将密码存储在任何地方或者通过反复要求他们重新提供密码来惹恼他们,我需要一种适当的机制来通过WCF服务对用户进行身份验证.
基于我看到的其他问题和答案,我正在考虑一种"登录会话"方法,当用户最初登录到Web应用程序时,将在自定义成员资格数据库中创建登录会话,并确定登录会话通过GUID,并在一段时间不活动后自动过期.Web应用程序将为每个登录用户"记住"登录会话GUID(存储在Forms Authentication Ticket或会话中).
WCF服务还将提供其自己的登录操作,接受用户名和密码,并返回如上所述的登录会话GUID.
然后,WCF服务将接受所有其他操作的登录会话GUID,并在允许操作继续之前验证GUID表示尚未过期的有效登录会话.
我已经做了相当多的背景阅读,并且有很多关于直接使用UserName客户端凭证类型的材料,但这需要Web应用程序记住用户的密码,这看起来不是很好我的想法.
我已经完成了一些研究,并在MSDN上找到了材料,但这似乎是很多努力来实现(至少对我来说)似乎是一个非常常见的使用场景.
题
上面描述的"登录会话"的一般方法是否合理?
如果是这样,实现它的最佳方法是什么?
如果没有,你能建议一个替代方案吗?
感谢大家的意见。我已经确定了一种方法(至少现在是这样)。它相当简单并且非常适合我的目的。
使用“UserName”clientCredentialType 和返回安全令牌的显式服务登录方法(为简洁起见,省略了令牌生成详细信息),服务客户端可以决定是传递真实密码作为客户端凭据上的密码属性还是安全令牌相反(从登录方法获得)。如果客户端是 Web 应用程序,则安全令牌可以存储在表单身份验证票证、会话或任何地方。
使用“自定义”userNamePasswordValidationMode 和 UserNamePasswordValidator 的自定义实现,验证器检查密码以确定它是否是有效的安全令牌或密码 - 如果是密码,则根据用户存储(SQL Server 数据库)对客户端凭据进行身份验证,如果它是安全令牌,则会检查它以确保它有效、未过期并且属于用户名。