【问题标题】:Forms authentication over http in WCF - how do I know which user is calling me在 WCF 中通过 http 进行表单身份验证 - 我如何知道哪个用户正在呼叫我
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试在服务方法内部查看 Watch 窗口中的值。没有可用的“线程”:错误 CS0103:当前上下文中不存在名称“线程”您写了“将其发送到您的服务方法”。我不明白。从哪里发送?
    • 我通常将 Web api 项目而不是 WCF 公开到 Internet。在 asp.net 应用程序中,您可以通过 User.Identity.Name 或 Thread...Name 访问登录的身份名称。在您的情况下,在 WCF 被公开的情况下,必须有一种方法可以访问这些值。注意:我讨厌将 WCF 服务直接暴露在互联网上,相反,最好将 asp.net web api / mvc 暴露在互联网上并让它与您的 WCF 通信,但这超出了我假设的您的要求范围。跨度>
    • 感谢您的澄清。根据您的原始答案,我进行了更多搜索,发现我应该可以访问 ServiceSecurityContext.Current.PrimaryIdentity.Name。但是我的 ServiceSecurityContext.Current 为空,这意味着我需要正确配置 http 绑定。但是,您让我意识到我正面临一个关于我的服务架构的更大问题,而且我对这个主题知之甚少,无法继续。与其继续盲目地胡闹,我还需要做更多的学习。
    • 好吧,你并没有完全解决我的问题,但是好吧。
    • 谢谢@Shaggydog。如果需要,我可以帮助您实现您正在寻找的东西。
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多