2011-05-16 70 views

回答

4

爱德华多,你问:@carlosfigueira:我可以用它来实现认证子系统吗?

我正在研究同一个问题,并且至少为您和即将推出的基于授权标头的解决方案(如下所述)提供解决方案(我相信您正在考虑“拦截”)。

,以确保基于模型REST WebHttp编程WCF 4端点最简单的方法是这样的:

  1. 问题一个共享密钥和API密钥给每一个客户作为凭证使用。 API密钥与用户名真正相同。
  2. 通过SSL运行所有端点以确保您始终具有通道/消息/数据安全性
  3. 要求客户端使用共享密钥来生成包含时间戳记及其API的HMAC-SHA1(或equiv)散列签名字符串键。
  4. 要求客户端传递的这些所有3作为查询字符串参数在每个请求中
  5. 在你的服务端,实现认证方法,它的所有3个字符串,然后:
    • 查找该API密钥,并返回客户端的共享秘密,有一个DB或其他地方。
    • 将时间戳与DateTime.Now进行比较以确保请求不超过15分钟以抵御重播攻击。
    • 使用这3个字符串,重新创建签名字符串并将其与客户端传入的字符串进行比较。
    • 如果它们匹配,请求者是真实的。现在

,更好的方式来做到这一点是通过使用HTTP授权请求报头存储的3串,并有一个全球性的拦截十岁上下的过程看所有请求。这将防止没有身份验证块的暴露端点的可能性(至少,其可能性较低)。

使用查询字符串来传递所有这些信息的问题是查询字符串的最大长度为2k(因客户端/浏览器而异),并且查询字符串在调试时非常难以读取......但只是得到使用到它。

有人认为更复杂的方法是STS模型,您需要客户端将这3个身份验证字符串传递给安全令牌服务端点。响应消息会传回一个会话令牌,客户端会在每个呼叫中​​传递一个会话令牌来代替3个字符串。确实,对于客户端而言,在每次调用时都不需要生成HMAC哈希签名,但服务器端仍必须对令牌进行身份验证,并且会话概念会导致干净的RESTful无状态行为。

我会尽我所能发布实现查询字符串和auth头文件方法的代码块。

7

我回来了一个更新。

我碰巧重视代码的简单性,并且在成功解决了这个问题后,我不能说我比查询字符串方法更喜欢它。将一次调用放入每个调用AuthN方法并与AuthZ方法并行的服务端点似乎比一些人认为的更容易。

无论如何,足够的意见......对解决方案。该解决方案是正确的在我们的#2的眼睛在这个环节,但于我们而言不是很好的描述......所以我会给予信贷“user634119”示例代码这里找到: Headers in OperationContext

首先,我们需要添加一个serviceBehavior我们的web.config文件:

<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager> 
     <serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF"> 
     </serviceAuthorization> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

下使一个类(称为BasicAuthorization如serviceBehaviors引用上述块):

//Authorize the call against the URI resource being requested... 
public class BasicAuthorization : ServiceAuthorizationManager 
{ 
    public override bool CheckAccess(OperationContext operationContext, 
    ref Message message) 
    { 
     //some code 
    } 
} 

下使身份验证类:

// Authenticate the header signature as described in my previous post 
public class BasicAuthentication : ServiceAuthenticationManager 
{ 
    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
     ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, 
     ref Message message) 
    { 
     //some code 
    } 
} 

在验证方法,使用HttpRequestMessageProperty拉动请求头细节出并执行在我的第一应答描述的相同的3个步骤。

+0

我一直在阅读/关注如何保护用WCF 4.0实现的基于REST的服务。没有一个提供了一个简单的解决方案。但是这似乎是实现身份验证和授权的最优雅的解决方案。 – 2013-10-09 14:45:56

相关问题