【发布时间】:2017-05-05 19:02:30
【问题描述】:
我正在使用 WCF 开发客户端-服务器应用程序。第一个客户端将是桌面应用程序 (WPF),但我计划添加 Xamarin(Android 和 iOS)和 Web 客户端。我希望这是一项互联网服务,并可能支持大量客户端,因此我使用 http,一种无状态服务来节省服务器资源。
我在实现身份验证逻辑时遇到了困难。 我发现了这个实现表单身份验证的好例子:
http://www.dotnetspeak.com/wcf/securing-wcf-with-forms-authentication/
它允许我按照自己的方式处理身份验证 - 将用户名和密码与数据库进行比较,创建身份验证 cookie 并将其返回。使用此 cookie 的后续调用将自动进行身份验证。
但问题是,我不知道是哪个用户调用了该服务。如果用户 1 调用 GetMyData(),我想确保他只获取自己的数据。我显然不想让客户端在每个请求中单独发送他们的 ID,因为这很容易被篡改——只需将“user1”切换为“user2”,嘿,你正在获取其他人的数据。 我可以通过调用来访问服务方法中的身份验证cookie
WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Cookie]
(我还可以看到还有一个名为“Host”的标题)
cookie 是从 FormsAuthenticationTicket 生成的,其中包含用户名和密码,但它是加密的。我不确定我是否可以在我的代码中解密 cookie,但我很确定这不是正确的方法。我的方法是在底层系统对调用者进行身份验证后调用的,因此推测 cookie 已被解密并且票证被发现是有效的。那么为什么我无法获取数据呢?
遗憾的是,我发现的每一篇文章都只涉及对用户进行身份验证,但似乎没有人关心之后哪个用户在使用该服务,只要他获得授权。
我想我可以在服务器端存储 cookie,以及映射到特定用户,然后以这种方式找到用户。但出于性能原因,我希望服务尽可能无状态。此外,这将涉及对 300 个字符长的字符串进行全文匹配 - 对于每个请求!哎呀!
在我看来,我需要的是一个非常常见的用例,所以必须有一个适当的方法来做到这一点。我似乎无法找到它。谁能帮帮我?
【问题讨论】:
标签: wcf authentication cookies forms-authentication