在 WCF 中通过 http 进行表单身份验证 - 我怎么知道哪个用户在给我打电话

Forms authentication over http in WCF - how do I know which user is calling me

我正在使用 WCF 开发 client-server 应用程序。第一个客户端将是桌面应用程序 (WPF),但我计划添加 Xamarin(Android 和 iOS)和 Web 客户端。我希望这是一个互联网服务,并可能支持大量客户端,所以我使用 http,一种无状态服务来节省服务器资源。

我在实施身份验证逻辑时遇到困难。 我发现了这个实现表单身份验证的好例子:

http://www.dotnetspeak.com/wcf/securing-wcf-with-forms-authentication/

它允许我按照自己的意愿处理身份验证 - 将用户名和密码与数据库进行比较,创建身份验证 cookie 并 return 它。使用此 cookie 的后续调用将自动进行身份验证。

但问题是,我不知道是哪个用户调用了该服务。如果 GetMyData() 被 user1 调用,我想确保他只获取他自己的数据。我显然不想让客户端在每个请求中单独发送他们的 ID,因为这很容易被篡改 - 只需将 "user1" 切换为 "user2" 嘿,转眼间,你得到了别人的数据. 我可以通过调用

获取服务方法中的身份验证 cookie
WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Cookie]

(我还可以看到还有一个叫 "Host" 的 header)

Cookie 是从 FormsAuthenticationTicket 生成的,其中包含用户名和密码,但已加密。我不确定我是否可以在我的代码中解密 cookie,但我很确定这不是正确的方法。我的方法是在底层系统对调用者进行身份验证之后调用的,因此可以推测 cookie 已被解密并且票据被发现是有效的。那么为什么我不能获取数据呢?

遗憾的是,我找到的每篇文章都只涉及对用户进行身份验证,但似乎没有人关心哪个用户之后使用该服务,只要他获得授权即可。

我想我可以存储 cookies server-side,连同到特定用户的映射,然后以这种方式找到用户。但出于性能原因,我希望服务尽可能无状态。此外,这将涉及对 300 个字符长的字符串进行全文匹配 - 对于每个请求!哎呀!

在我看来,我需要的是一个非常常见的用例,所以必须有一个合适的方法来做。我就是找不到它。谁能帮帮我?

如果您正确设置了 Forms 身份验证,那么您可以通过 Thread.CurrentPrincipal.Identity.Name 获取登录用户名并将其发送到您的服务方法以进行数据访问验证。从用户名获取用户 ID 并验证所有权。

Thread.CurrentPrincipal.Identity.Name 解密 cookie 票证和 returns 登录用户名。