【发布时间】:2014-07-24 04:36:38
【问题描述】:
我有一个使用表单身份验证的 ASP.NET MVC5 站点,但也通过设置使用客户端证书来增加一层安全性:
<security>
<access sslFlags="SslNegotiateCert" />
</security>
客户端证书是可选的,因为在用户实际尝试登录站点之前不需要它。当用户尝试登录时,站点将验证 Thumbnail、Issuer,并将 Subject 与尝试登录的用户进行比较(每个用户会有不同的证书)。问题是每次用户来到当他们首次进入该站点时,系统会提示他们提供客户端证书,这可能会在以下情况下导致问题:
- 他们不小心选择了错误的证书
- 想要注销并使用其他用户重新登录(未重新提示输入证书)
有没有一种方法可以根据提供的登录信息静默\自动检测客户端证书,而不是让用户在首次进入网站时选择证书?
编辑:添加更具体的实际\期望行为示例
实际行为:
- 用户打开 Chrome 并转到 http://www.example.com
- Chrome 弹出窗口询问用户他们想要使用什么客户端证书
- 用户选择“user3 (www.example.com)”
- 用户看到未经身份验证的主页视图并单击“登录”按钮
- 用户输入用户名:“user2”和密码:“****”
- 网站验证 ClientCertificate.Subject == 用户名(失败,因为证书适用于“user3”)
期望的行为:
- 用户打开 Chrome 并转到 http://www.example.com
- 用户看到未经身份验证的主页视图并单击“登录”按钮
- 用户输入用户名:“user2”和密码:“****”
-
浏览器做某事以静默检测客户端是否具有证书“user2 (www.example.com)”,几乎没有用户交互
问题:“期望的行为”是否可能以某种方式实现? (header?javascript?浏览器插件?)
【问题讨论】:
-
您可以添加一个带有用户身份的友好名称并以这种方式进行搜索。
-
您可能还可以看看这个:technet.microsoft.com/en-us/library/bb742438.aspx 将证书映射到用户帐户的分步指南 这篇文章很旧,但应该仍然能够从中找出一些东西
-
谢谢。我实际上没有映射问题,而只是提供证书->登录的顺序。我会更新我的问题以更好地解释......
-
只是想知道为什么您认为有必要同时拥有客户端证书身份验证和用户名+密码。考虑到您似乎建议您的用户也可能在同一个网站上拥有多个有效身份,这对于大多数要求来说听起来有点过于复杂......
-
通常,这种身份验证的两个因素是:用户拥有什么(智能卡)和用户知道什么(解锁智能卡的 PIN 码)。您将在这里介绍的将是第三个因素。不确定有多少用户对此有足够的耐心(通常,当用户发现安全措施过于繁琐时,他们会尽其所能绕过它们,这可能比您想要实现的更糟糕)。如果你真的想要一个服务器端密码,可能值得实现一个只询问密码的系统,从证书中获取用户名。
标签: asp.net asp.net-mvc iis ssl client-certificates