c# - 使用Windows帐户SID作为安全 token

标签 c# web-services security active-directory

我正在创建一些web服务,我希望使用自定义(即,不是ws-secure,等等)方法来保护这些服务。目前我的计划是有一个方法,使用active directory用户名和密码(当然是通过https)来验证用户。然后,此方法将获取该用户的帐户sid,并使用安全但可逆的方法对其进行加密,然后将其作为安全令牌传回。
在此之后,调用者将加密的令牌作为参数传递给每个web方法,以确保调用者得到身份验证。然后,可以对令牌进行解密并将其返回到目录条目(从而确认它们的真实性)中,这一点非常简单。这增加了允许方法绝对识别经过身份验证的调用方的好处。
但是,使用帐户中的sid(通常只在内部使用)有点让我担心。这安全吗?
编辑:正如我在下面的评论中所说,我已经意识到令牌需要“sessionised”-也就是说,它需要过期以减少令牌重用的可能性。这可能是通过将客户端会话作为令牌的一部分来处理的。

最佳答案

好吧,这是一个很长的答案…
这样做的问题是,如果您需要代表用户执行操作(即模拟该用户),那么持久化sid将不足以重新验证该用户,因为您需要os提供的安全令牌。如果你只有sid,在这种情况下你仍然需要密码-除非你在你的广告商店使用可逆加密,我严重怀疑是这样-当然希望不是这样!
除此之外,还有一个问题,就是一旦你加密了这个sid并将其发送回去,它可能是安全的(只要我们假设https总是安全的),但一旦它在客户机上就不安全了。
有人可以窃取加密的sid并开始发出请求,就好像他们是那个用户一样。
在我看来,如果您使用ad作为后端身份验证存储,那么您应该只使用协商或kerberos身份验证。如果需要的话,它生成的票可以用来冒充用户;我不相信它们会被偷走(尽管在安全领域,几乎任何技术上都是可能的)。
但是,这样做可能会使您的web服务很难使用——我当然不会考虑为这些协议编写自己的客户端。
在我说如果我面对这个我可能会做什么之前,我首先要说的是,它并不真正安全-它只是有点棘手的人来捣乱,同时也从实际用户中删除令牌的关联(加密信息背后的模式是黑客最好的朋友)。我随后还列出了其他注意事项:
使用AD作为身份验证方法,但不要再使用它,单独跟踪身份验证会话,并为它们提供与AD SIDS-guid或类似内容不直接相关的唯一密钥。这样,每次用户进行身份验证时,他们将获得不同的核心会话ID。
我会在每个会话上标记它的创建时间,以及一个加密安全的唯一随机盐(一个nonce-尽管这里使用它的方式与wikipedia描述它的方式不同)。使用RNGCryptoServiceProvider进行此操作)。我也会将一些(但不是全部)关于客户机(IP,用户代理)的信息合并到其中。
然后,我将首先构造一个令牌作为一个字符串,将所有这些信息组合在一起,然后使用一个128位iv和256位密钥(这两个密钥都必须非常安全,并且应该再次使用Rijndael随机生成)对其进行加密。.
你把这个发送回客户端,然后他们在他们的请求中使用它(直到它过期-这是绝对必须做的)。
当你收到代币时
解密它,小心黑客会生成加密值,从而破坏解密例程并抛出必须隐藏的异常。
验证会话ID、时间戳、唯一编号和客户端信息是否与创建会话时录制的内容匹配。如果有任何问题,您将立即终止会话。过期的会话然后返回到后续的请求甚至没有被验证,它们简单地生成一个403。如果您使用网络信息来保护令牌,这意味着如果用户在漫游网络上,则使用该服务时将遇到问题。
身份验证会话永远不应该是开放式的—它们应该有到期时间,以防止使用非常旧的令牌。
当然,不用说要一直使用https。
所有这些-你对认证等的选择应该与传输的数据类型和人们能做的事情成比例。如果黑客对你的服务不感兴趣;或者环境完全是内部的,那么就用你原来的想法来破解。
警告∞!
(这是无限的力量)
虽然我已经提出了这个解决方案,但由于许多原因,它并不安全,如果涉及到任何真正的秘密,我也不会使用它。
它依赖于https来向客户端验证服务器-这在客户端交出用户名和密码组合之前非常重要。把它拿走,它就会断开,如果你操作客户端计算机上的证书链,也可以完全避开。它还依赖于https通道来保护传输中的用户名/密码组合。
我们应该更进一步,在请求上引入消息编号和签名,以确保客户机仍然是他们所呈现的自己,因为IP地址和头很容易被欺骗。我们还应该考虑使用大型素数和jazz进行密码传输的非对称加密,甚至在考虑https之前。
所以,基本上,如果它的安全关键-忽略我和咨询专家-不要试图滚动自己,因为你会得到错误的。
如果你被一个12岁的极客黑客攻击的原因仅仅是因为这就是12岁的极客所做的,那么我的解决方案可能太重了,你不妨采纳你的想法。
不管怎样-我不保证会发生什么,我猜从某种程度上说,现在很长的答案是你们都听我的,无视我,后果自负:)

关于c# - 使用Windows帐户SID作为安全 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4828721/

相关文章:

android - 确保 REST 服务仅由特定的 Android 应用程序使用

c# - 带有 CancellationTokenSource 的 Task.Factory.FromAsync

asp.net - 如何使用 ASP.NET 调用 Web 服务(.wsdl)

Windows Azure 免费帐户

java - 这个 JAX-RS Web 服务如何工作?

web-services - 如何在公司内围绕 Web 服务实现安全性

c# - C# 中 Migration 文件夹类内的意外操作

c# - 长度为 5 和 , 或 的 float 的正则表达式。分隔符

c# - 是否可以在 WinForms 中以编程方式触发 "fake"滚动?

java - 火狐 "ssl_error_no_cypher_overlap"错误