Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用X509Certificate2在https中进行客户端证书身份验证_C#_Asp.net_Security_Authentication_Ssl - Fatal编程技术网

C# 使用X509Certificate2在https中进行客户端证书身份验证

C# 使用X509Certificate2在https中进行客户端证书身份验证,c#,asp.net,security,authentication,ssl,C#,Asp.net,Security,Authentication,Ssl,我试图了解在https场景中客户端身份验证是如何工作的,以及如何使用它来提供基本的身份验证/授权功能 假设我想在证书和用户之间建立映射(例如IPrincipal)。我的服务器发布证书并将其分发给客户端。当客户端连接时,我请求证书,如果提供了有效的证书,我将根据前面定义的映射对用户进行身份验证 我应该使用什么来创建映射?cert指纹是一个好的候选人吗?确定客户身份就足够了吗 或者我根本不需要映射,可以简单地接受服务器颁发的所有证书 编辑:让我重新表述一下-假设我可以颁发客户端证书,那么如何在htt

我试图了解在https场景中客户端身份验证是如何工作的,以及如何使用它来提供基本的身份验证/授权功能

假设我想在证书和用户之间建立映射(例如IPrincipal)。我的服务器发布证书并将其分发给客户端。当客户端连接时,我请求证书,如果提供了有效的证书,我将根据前面定义的映射对用户进行身份验证

我应该使用什么来创建映射?cert指纹是一个好的候选人吗?确定客户身份就足够了吗

或者我根本不需要映射,可以简单地接受服务器颁发的所有证书


编辑:让我重新表述一下-假设我可以颁发客户端证书,那么如何在https会话期间验证客户端身份?

您的要求很大程度上取决于您现有的证书基础结构的外观。 出于安全原因,我强烈建议通过映射识别特定用户。如果您已经为用户身份验证分发了证书,那么可能有一些东西值得保护。您需要的任何授权或审核都应该是针对每个用户的。 最好的方法是使用证书CN(通用名称)。指纹将识别为特定证书,但证书过期时会发生什么? 这当然意味着,当您发布证书时,CN是受控制的,并且将与特定的人相关。我发现使用电子邮件地址非常可靠,因为您可以通过向他们发送确认电子邮件来创建验证例程。您还可以强制电子邮件地址具有某种唯一性


最困难的部分是分发证书,让IIS向客户端请求证书,以便您的asp.net应用程序能够访问其信息。一旦你有了这些证书,你的所有请求都会在
Request.ClientCertificate
中有一些内容,其中包含了他们证书的所有详细信息,你需要对他们进行身份验证。

你的请求很大程度上取决于你现有的证书基础结构的外观。 出于安全原因,我强烈建议通过映射识别特定用户。如果您已经为用户身份验证分发了证书,那么可能有一些东西值得保护。您需要的任何授权或审核都应该是针对每个用户的。 最好的方法是使用证书CN(通用名称)。指纹将识别为特定证书,但证书过期时会发生什么? 这当然意味着,当您发布证书时,CN是受控制的,并且将与特定的人相关。我发现使用电子邮件地址非常可靠,因为您可以通过向他们发送确认电子邮件来创建验证例程。您还可以强制电子邮件地址具有某种唯一性


最困难的部分是分发证书,让IIS向客户端请求证书,以便您的asp.net应用程序能够访问其信息。一旦你有了这些证书,你的所有请求都会在
Request.ClientCertificate
中有一些内容,其中包含他们证书的所有细节,你需要对他们进行身份验证。

我假设你使用的是.Net framework。您可以尝试使用HttpRequest.ClientCertificate属性。证书验证已使用ASP.NET完成。您只需检查IsValid属性。其余的验证是将证书映射到用户

如果所有证书均由同一CA颁发,则可以使用证书序列号。如果不包括,则包括带有序列号的HttpClientCertificate.Issuer属性


如果以后需要调试,很难使用指纹。

我假设您使用的是.Net framework。您可以尝试使用HttpRequest.ClientCertificate属性。证书验证已使用ASP.NET完成。您只需检查IsValid属性。其余的验证是将证书映射到用户

如果所有证书均由同一CA颁发,则可以使用证书序列号。如果不包括,则包括带有序列号的HttpClientCertificate.Issuer属性


如果以后需要调试,很难使用指纹。

您的问题包含两个不同部分:

1) 我如何验证客户证书是由我颁发的且信誉良好

非常一般的答案是,您根据受信任的根证书验证它的链。 例如,您可以在此处阅读:

http://www.openssl.org/docs/apps/verify.html

在大多数情况下,您不必编写任何代码来实现这一点。您只需在web服务器之前安装(例如)Apache。Apache可以配置为根据可信证书请求和验证客户端证书

2) 如何将证书映射到用户

若您正在寻找一种通用的方法来实现它,那个么您应该在证书中使用Subject Alternative Name属性来存储主体名称。这是多个提供商使用的最常见的方式

以下是两个与Windows相关的有趣链接:


然而,一般来说,您可以使用证书中任何唯一的东西进行映射

您的问题包含两个不同部分:

1) 我如何验证客户证书是由我颁发的且信誉良好

非常一般的答案是,您根据受信任的根证书验证它的链。 例如,您可以在此处阅读:

http://www.openssl.org/docs/apps/verify.html

在大多数情况下,您不必编写任何代码来实现这一点。您只需在web服务器之前安装(例如)Apache。Apache可以配置为根据可信证书请求和验证客户端证书

2) 如何将证书映射到用户

若您正在寻找一种通用的方法来实现它,那个么您应该在证书中使用Subject Alternative Name属性来存储主体名称。这是多个提供商使用的最常见的方式

以下是两个与Windows相关的有趣链接:

但是,一般来说,您可以使用