此WebService安全方案存在哪些潜在问题?

ili*_*rit 5 security web-services

我们有一个服务,根据用户名和密码处理授权.我们将其放在SOAP标头中,而不是将用户名和密码作为调用的一部分.

在典型的场景中,Web Service在执行开始时调用Authorization服务以检查是否允许调用者调用它.问题是这些Web服务中的一些相互调用,这意味着在每个子调用中都会检查用户的权限,这可能非常昂贵.

我想做的是让授权服务在第一次调用后返回安全令牌.然后,Web Service可以在本地验证安全标头,而不必每次都调用授权服务.

安全标题看起来像这样(C#代码 - 修剪以说明基本概念):

public sealed class SecurityHeader : SoapHeader
{
    public string UserId;     // Encrypted   
    public string Password;   // Encrypted; Just realized this field isn't necessary [thanks CJP]

    public DateTime TimeStamp;   // Used for calculating header Expiry
    public string SecurityToken;
}
Run Code Online (Sandbox Code Playgroud)

一般的想法是每次调用都会检查SecurityHeader.如果它存在,但尚未过期,并且SecurityToken有效,则Web方法将正常进行.否则它将返回错误,或者它将尝试重新授权并生成新的SecurityHeader

SecurityToken基于UserId,Password和TimeStamp的盐渍哈希.每天更换盐以防止重放.

我看到的一个问题是用户可能有权访问Web服务A,但不能访问Web服务B.如果他调用A并收到安全令牌,就像现在一样,这意味着如果他使用B将让他通过同样的道理.我必须更改它,以便安全令牌仅在从Web服务到Web服务,而不是用户到Web服务,即.如果用户调用A调用B,则应该没有问题,但如果用户调用服务A然后调用服务D则不行.解决方法是将公共密钥(或一组密钥)分配给逻辑相关的服务.(即如果客户可以做A,那么逻辑上他也可以做​​B).

或者,我必须将用户的整个权限集编码为安全头的一部分.我将不得不调查开销是多少.

编辑:

有几个人提到了其他安全方案,比如WS-Security和SAML等.我已经有了.事实上,我从WS-Security那里得到了这个想法.问题是其他方案不提供我需要的功能(缓存授权信息并防止在没有中间数据库的情况下重放).如果有人知道一个方案,那么我会用它来替代它.此外,这不是关于身份验证.这是由我无法控制的另一种机制处理的.

如果事实证明无法缓存授权数据,那么这意味着我只需要承担每个级别的授权开销.

Mit*_*ers 1

就我个人而言,只要您有一个集中的底层框架来支持 SecurityToken 值的验证,我认为您不会遇到任何问题。