.NET Core和IIS间歇性403访问被拒绝

Gra*_*aum 5 c# iis windows-authentication .net-core asp.net-core

好的Stackoverflow,经过无济于事的研究之后,我终于来到了这里!

我试图通过Windows身份验证和SSL从IIS托管一个.NET Core 2.0站点,无论我如何尝试,都会继续出现不一致/间歇性的403访问被拒绝错误。

如果出现某些错误,我希望它永远不会起作用。但是,如果我重新启动网站和应用程序池,它可能会起作用〜3/10次。在事件查看器,应用程序日志或IIS跟踪日志中找不到任何有用的东西。

我做的事情没有特别的顺序:

  1. 应用程序池以具有对我的数据库的权限(prod.service $)的gmsa帐户运行
  2. 授予作为服务登录的权限,并批量登录gmsa帐户。
  3. 在Web根文件夹上授予IIS_IUSRS,prod.service $和“域用户”权限。目前处于完全失控的绝望之中。
  4. 授予IIS_IUSRS,prod.service $和域用户对该证书的权限。
  5. 启用Windows身份验证,禁用匿名身份验证
  6. 设置指向首页的默认文档。
  7. 将应用程序池设置为“加载配置文件”
  8. 将.NET CLR版本设置为“无托管代码”
  9. 在web.config中将ForwardWindowsAuthToken设置为true
  10. NTLM已作为“站点”>“身份验证”>“右键单击Windows身份验证”>“提供程序”下的第一个身份验证提供程序移到列表的顶部。

更详细的一点是,我试图与来自建立单向信任关系的其他域中的用户进行身份验证。我将使用来自“其他”域的凭据迁移到主机,因此它具有可见性。

这是我的web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\MCP.MVP.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" startupTimeLimit="3600" requestTimeout="23:00:00" />
    <defaultDocument>
        <files>
            <add value="/home/index" />
        </files>
    </defaultDocument>
  </system.webServer>
</configuration>

<!--ProjectGuid: [REDACTED] -->
Run Code Online (Sandbox Code Playgroud)

从Startup.cs:

services.AddAuthentication(IISDefaults.AuthenticationScheme);    
services.Configure<IISOptions>(options => 
    {
        options.AutomaticAuthentication = true;
    });
Run Code Online (Sandbox Code Playgroud)

从Program.cs

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();
Run Code Online (Sandbox Code Playgroud)

随处使用Authorize属性:

[Authorize(Policy = "RequireViewerRole")]
Run Code Online (Sandbox Code Playgroud)

授权胶水,其中Configuration [“ RequireViewerRoles”]是用逗号分隔的域组列表:

services.AddAuthorization(options =>
        {
            options.AddPolicy("RequireViewerRole", policy => policy.RequireRole(Configuration["RequireViewerRoles"].Split(',')));
        });
Run Code Online (Sandbox Code Playgroud)

我是否已经进入.NET Core 2.0 Bug领域,或者我缺少什么?

Gra*_*aum 2

原来这是一条巨大的红鲱鱼!

这是 401.2“无效服务器配置”错误。我终于注意到一种模式,如果我打开文件夹安全权限对话框,应用程序将工作,这将强制访问域控制器并缓存来自用户域的组名称。该应用程序可以正常工作大约 5 分钟,然后拒绝再次进行身份验证且未进行任何其他更改。

通过在组上配置域名解决了该问题,回想起来这是显而易见的。(域名\\域用户)。事实上,它在没有域名的情况下也能工作,这导致了很多混乱。IIS 日志中没有任何内容表明此错误,最终通过反复试验解决了该问题。