iis .NET Core和客户端证书验证

vmjh9lq9  于 2023-10-19  发布在  .NET
关注(0)|答案(1)|浏览(171)

我有一个API,作为IIS网站上的子应用程序运行。我使用.NET 7开发了API,它利用了客户端证书身份验证方案。我还为端点添加了一些额外的授权处理程序。
我的网站配置为需要客户端证书,所有形式的身份验证,包括匿名被禁用与clientCertificateMappingAuthentication例外。
因为它是一个.NET Core应用程序,所以应用程序池被设置为“无托管代码”。IIS中应用程序可用的唯一模块是身份验证和授权规则。同样,对于应用程序,除了clientCertificateMappingAuthentication之外,所有形式的身份验证都被禁用。授权规则设置为拒绝匿名用户(第一个规则),然后设置为允许所有用户。
在我的.NET框架API中,如果用户是匿名的,请求甚至不会到达API。IIS会直接拒绝请求并返回401错误。
我写的.NET Core应用程序不是这样的。请求发送到API,但是由于我的授权处理程序,我的代码以403错误拒绝了它。
我想我的问题是,这是设计的问题,还是我的应用程序配置有问题?

cnwbcb6i

cnwbcb6i1#

对这个问题的简短回答是,这是设计出来的。
IIS中的安全性有一些细微的差别,这是我所缺少的。
ClientCertificateMappingAuthentication要求用户拥有证书,用户帐户必须位于Active Directory中,IIS服务器必须属于Active Directory域。如果用户提供了证书并且在Active Directory域中找到,则为该用户提供Windows标识。如果找不到用户,我相信会为用户提供一个Windows标识,但该标识会标记为未经身份验证,并且不会填写所有其他附加标识属性。
您还必须将站点配置为要求SSL并协商证书。如果用户没有提供证书,IIS将拒绝请求并返回403 HTTP错误。
此身份验证方法不会阻止用户访问系统。使用这种身份验证方法,如果用户的证书未Map到帐户,则用户仍将被视为匿名。
一旦用户通过身份验证(或未通过身份验证),对于.NET Framework应用程序,授权规则就会生效。在这些情况下(使用ASP.NET授权规则和IIS授权规则),您可以建立规则来拒绝匿名用户和允许所有其他用户。未通过Active Directory身份验证的用户是匿名的,请求将被拒绝,并显示401 HTTP错误,即您已通过身份验证,但不允许访问。
在配置.NET Core时,您可以为应用程序池配置针对该类型的“无托管代码”选项。这意味着IIS中唯一可用于配置的选项是IIS选项。您可以在IIS中配置“授权规则”选项。然而,我的理解是,受这些规则影响的唯一请求是静态文件。对.NET Core应用程序的请求独立于这些规则进行处理。
因此,根据Active Directory,匿名用户可以访问API中的端点。
.NET Framework和Core中的端点可供匿名和身份验证用户访问。授权代码是所有应用程序中的关键,用于拒绝不应该访问您的应用程序的用户。您需要对用户进行授权,而不是让IIS在最高级别使用授权规则模块为您进行授权。
在.NET Core中,您可以使用[AllowAnonymous]装饰端点以绕过授权要求。如果您使用的是Minimal API,则在定义端点时应使用AllowAnonymous。
.NET Core背后的逻辑独立于Authorization Rules模块中定义的规则运行是有意义的,因为现在有各种各样的方法来验证和授权用户。我可以看到在顶层定义的、继承的总括规则如何干扰对应用程序的访问。
我认为这涵盖了一切。

相关问题