【问题标题】:Pass auth token to wcf one time将身份验证令牌传递给 wcf 一次
【发布时间】:2015-02-24 11:42:49
【问题描述】:

我刚开始使用 wcf 服务构建一个 Web 应用程序来使用我的服务。我基于该令牌制作了该令牌,我在每个请求中传递令牌,然后在来自数据库的每个请求中检查该令牌是否有效。我认为每次都向 db 发送额外的请求是不好的。那么,这是否可以在用户第一次登录或首次发出服务请求时对用户进行身份验证,之后直到会话保持我的所有请求都使用令牌?

我在谷歌上搜索,但每个人都在告诉如何使用服务进行身份验证。

【问题讨论】:

  • 你向服务传递什么样的令牌?
  • 它只是用户创建时生成的随机字符串

标签: asp.net wcf webforms restful-authentication


【解决方案1】:

不是您生成并需要在数据库中检查的随机字符串,而是像许多身份验证模块一样围绕加密和/或签名制作您的令牌。

换句话说,根据用户/应用程序名称、发布日期和/或到期日期构建一个令牌,对其进行加密,您就拥有一个独立的令牌,不需要任何数据库查找来验证。

为了方便加密,可以使用MachineKey

http://msdn.microsoft.com/en-us/library/system.web.security.machinekey%28v=vs.110%29.aspx

附注 - 这是表单身份验证/会话身份验证模块的工作方式。您有携带身份验证信息的 cookie(令牌)。您可以考虑切换到这些。

编辑:您询问的示例:

// create token
string username = "foo";
string token = Convert.ToBase64String( MachineKey.Protect( 
                  Encoding.UTF8.GetBytes( username ) ) );

// get username out of token
string token = ....;
string username = Encoding.UTF8.GetString( MachineKey.Unprotect( 
                  Convert.FromBase64String( token ) ) );

【讨论】:

  • 你能举个例子吗,我没看懂
  • 我用一个基本示例编辑了我的答案,该示例应该让您了解如何设计自己的令牌。
  • 并在取出令牌后做什么我如何验证这是一个需要使用我的服务的真实客户端,即使在这种情况下我也需要调用数据库。那你能解释一下怎么办
  • 我有很多客户会使用我的服务,每个客户都会有不同的令牌,所以如何知道哪个客户在打电话以及客户是在打电话还是假的
  • 由于令牌是在服务器端加密的,所以客户端真的没有办法伪造它们。
【解决方案2】:

在每个请求上使用数据库检查 Auth 令牌可能是个坏主意。通常用作令牌的是当前用户主体本身,但已序列化和加密。 登录时生成令牌并返回给客户端。然后在每个请求中,您将令牌传递给服务,这使您有机会反序列化它并填充您的 System.Threading.Thread.CurrentPrincipal 而无需往返数据库。

查看这些 SO 答案以获得更多见解

  1. Delivering a JWT SecurityToken to a WCF client
  2. How to use Microsoft JWT Token Handler to secure webHttpBinding based WCF service

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2021-04-13
    • 2019-06-16
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多