在WCF中通过http格式化身份验证 - 我如何知道哪个用户正在呼叫我

时间:2017-05-05 19:02:30

标签: wcf authentication cookies forms-authentication

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

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

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

它允许我按照我想要的方式处理身份验证 - 将用户名和密码与数据库进行比较,创建身份验证cookie并将其返回。使用此cookie的后续调用将自动进行身份验证。

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

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

(我还可以看到另外一个标题为" Host")

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

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

我想我可以存储服务器端的cookie,以及映射到特定用户,并以这种方式找到用户。但出于性能原因,我希望服务尽可能无状态。此外,这将涉及对300个字符长的字符串进行全文匹配 - 对于每个请求!糟糕!

在我看来,我需要的是一个非常常见的用例,所以必须有一个正确的方法来做到这一点。我似乎无法找到它。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

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

Thread.CurrentPrincipal.Identity.Name解密cookie票证并返回登录的用户名。

相关问题