【问题标题】:Best practice to make use of Client Secret Key in SaaS environment在 SaaS 环境中使用客户端密钥的最佳实践
【发布时间】:2015-12-22 14:10:17
【问题描述】:

Asp.NET Web API 会在注册全新客户端时生成 Secret Key(使用 32 个字符长的对称算法)存储在数据库列中(对其具有唯一约束)。在整个 API 使用过程中,客户端必须在 Authorization 标头中提供 Secret Key 才能访问其自己的资源(多租户 SaaS 环境)。目前不需要访问令牌。需要 Client Secret Key 的主要原因是为了从数据库中过滤和传递适当的数据!

我认为使用 WHERE 子句中的 ClientSecretKey 从 SQL 表中获取客户端数据不会对性能友好,例如:

SELECT Multiple_Columns from ClientTable WHERE ClientSecretKey='X3i1aBer'

理想情况下,我更愿意使用 ClientId 获取客户记录,ClientId 定义为表中的 IDENTITY 列。

问题:

  1. 在对数据库执行查询以获取特定客户端记录时,如何最好地设计一个绝对性能友好的唯一客户端密钥?
  2. 我的想法或设计有什么缺陷吗?

任何想法都将不胜感激。

谢谢!

【问题讨论】:

    标签: c# sql-server api rest asp.net-web-api


    【解决方案1】:

    您的客户可能会传入一个 ID 和密钥。将这些视为用户名和密码。这极大地减少了仅仅向 API 扔一堆字符的人滥用的机会。

    ID 和密钥列都应该在数据库中建立索引以避免性能问题。

    对于像这样的简单字符串键,如果键不匹配,数据库不给我任何结果是我个人的偏好。这样,我就不必担心某些安全漏洞会将其发送回客户端。

    所以,是的,键应该在 where 子句中,但它不应该是 where 子句中的唯一内容。

    【讨论】:

    • 感谢您的回答。我曾考虑过指示客户传递 ClientId(整数),但不确定格式是什么?它会是一个单独的授权密钥吗?
    • 应该只有 1 个授权标头,但您可以将它们都放在 auth 标头中并解析出来。
    • 我正在考虑建议消费者以某种固定格式连接客户端 ID 和密钥。将使用 WHERE 子句中的“ClientId”从数据库表中检索密钥,并使用消费者使用字符串比较发送的内容来验证密钥。希望,有意义吗? :)
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2020-04-15
    相关资源
    最近更新 更多