C# 为用户登录创建一个安全的临时访问令牌,这足够好吗?

C# 为用户登录创建一个安全的临时访问令牌,这足够好吗?,c#,security,api,login,C#,Security,Api,Login,好的,我正在创建一个API,用于使用XML操作web应用程序中的用户和数据。如果他们发布XML,他们可以创建用户,等等。我正在使用一个两条腿的OAuth解决方案来保护和验证API请求。然而,这个问题并不是关于安全性的方面,而是我将描述的方面,它允许用户从API请求登录,而不必键入用户名和密码,以下是我的内容: 步骤1,合作伙伴使用XMLAPI创建用户,如果成功,系统将返回一个包含新ID的路径,例如“/user/99” 步骤2,合作伙伴向user/login/99发出请求,这将在我的数据库中创建一

好的,我正在创建一个API,用于使用XML操作web应用程序中的用户和数据。如果他们发布XML,他们可以创建用户,等等。我正在使用一个两条腿的OAuth解决方案来保护和验证API请求。然而,这个问题并不是关于安全性的方面,而是我将描述的方面,它允许用户从API请求登录,而不必键入用户名和密码,以下是我的内容:

步骤1,合作伙伴使用XMLAPI创建用户,如果成功,系统将返回一个包含新ID的路径,例如“/user/99”

步骤2,合作伙伴向user/login/99发出请求,这将在我的数据库中创建一个新的“登录令牌”,以下是相关属性:

UserID      int     FK
AccountID   int     FK
Token       string
Expiration  date
Used        bit
UserID和AccountID与相应的Users和Accounts表相关

标记是随机生成的GUID的前20个字符,删除了破折号,并将所有字符设置为ToUpper()

过期时间为DateTime.Now后30秒

Used = false
第3步,合作伙伴将了解系统的URL(与API位于不同的域上),他们现在可以这样发布:

http://otherdomain.webapp.com/core/login/[在此插入guid]

现在,每个帐户的“otherdomain”部分都将是唯一的,因此我们现在验证:

根据提供的guid查找LoginToken,如果它与匹配子域的帐户匹配,未过期(30秒内),并且“Used”设置为false,请登录用户,将Used设置为true,将他们定向到主页或其他URL(如果通过querystring提供)

因此,基本上你需要一个完整的注册应用程序和密钥以及所有jazz for OAuth,只需请求允许你登录但只在30秒内工作一次的GUID。。。他们首先需要了解登录URL,这足够好吗

最后,如果有人能在30秒内知道所有的GUID和URL,他们就可以通过hi-jack登录,但是这种可能性有多大

或者,我可以添加什么使其更安全?

(免责声明:我不是安全专家。)

我注意到的直接问题是:

http://otherdomain.webapp.com/core/login/[在此处插入guid]

根据您的设置,当请求GUID令牌时,必须将其提供给用户。这实际上是请求的密码。如果您通过HTTP发送,任何可以窥探连接的人都拥有令牌,因此劫持会话并不困难。这绝对必须在整个过程中使用SSL

除此之外,问题是您在用户使用令牌之前就将令牌发送给用户,这并不好。但是有了SSL,就您的目的而言,它可能已经足够好了。在处理无法处理正常身份验证的协议时,我使用了类似的方法,用户首先通过安全通道连接,并说“我想在另一个通道上进行传输”,然后服务器发回一个令牌,他们可以用于该请求。它在低安全性系统上运行得足够好。如果您要保护关键数据,我强烈建议您投入资金,在投入生产前请专家查看。

(免责声明:我不是安全专家。)

我注意到的直接问题是:

http://otherdomain.webapp.com/core/login/[在此处插入guid]

根据您的设置,当请求GUID令牌时,必须将其提供给用户。这实际上是请求的密码。如果您通过HTTP发送,任何可以窥探连接的人都拥有令牌,因此劫持会话并不困难。这绝对必须在整个过程中使用SSL

除此之外,问题是您在用户使用令牌之前就将令牌发送给用户,这并不好。但是有了SSL,就您的目的而言,它可能已经足够好了。在处理无法处理正常身份验证的协议时,我使用了类似的方法,用户首先通过安全通道连接,并说“我想在另一个通道上进行传输”,然后服务器发回一个令牌,他们可以用于该请求。它在低安全性系统上运行得足够好。如果您要保护关键数据,我强烈建议您投入资金,请专家在投入生产前查看这些数据