2014-12-27 50 views
1

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

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

+0

你传递给服务什么样的令牌的答案? – khlr 2014-12-28 18:40:13

+0

它只是一个随机字符串在用户创建时生成 – Ancient 2014-12-28 19:15:43

回答

0

取代您生成并需要在数据库中进行检查的随机字符串,使您的令牌围绕加密和/或签名,就像许多验证模块一样。

换言之,从用户/应用程序名称,发布日期和/或失效日期构建令牌,对其进行加密,并且您拥有一个自包含的令牌,不需要任何数据库查找进行验证。

为了便于加密,则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))); 
+0

你能举一个例子,我不明白 – Ancient 2014-12-29 18:27:16

+0

我编辑了我的答案一个基本的例子,应该给你一个想法如何设计自己的令牌。 – 2014-12-29 22:42:29

+0

并做出什么后得到令牌如何我可以验证这是一个真正的客户端,需要使用我的服务,即使在这种情况下,我需要调用数据库。那么怎么办才能解释 – Ancient 2014-12-30 07:35:17

0

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

检查这些所谓的更深入的了解

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