在Docker容器ASP.NET应用程序中集成Windows身份validation

我从微软/ aspnet存储库创build了一个容器。 我想在IIS中容纳一个ASP.NET 4.x web应用程序,在该应用程序中,我可以获取login的用户访问该网站。 我希望能够利用集成的Windows身份validation,因为这是一个内部应用程序。

我已经为容器主机创build了一个透明的networking。

另外,我在容器中的IIS上设置了Windows身份validation。 我已经阅读了关于在容器主机上创build一个Group Managed Service Account的问题,但是我还没有做到这一点,不确定这是否足够,否则我将不得不采取进一步措施。

创build组托pipe服务帐户(gMSA)只是为了使Windows身份validation与容器一起工作而需要采取的步骤之一。 您还需要一个Credential Spec,其中包含有关您创build的gMSA的信息,容器将使用它来交换应用程序池所使用的内置帐户(LocalSystem,NetworkService,ApplicationPoolIdentity)的gMSA帐户。

真的,最小的步骤是:

1)创build一个AD组,您可以使用它来添加将用于托pipe您的容器的机器。

PS> New-ADGroup "Container Hosts" -GroupScope Global PS> $group = Get-ADGroup "Container Hosts" PS> $host = Get-ADComputer "mydockerhostmachine" PS> Add-ADGroupMember $group -Members $host 

2)创build您的应用程序使用的gMSA帐户:

 PS> New-ADServiceAccount -name myapp -DNSHostName myapp.mydomain.local -ServicePrincipalNames http/myapp.mydomain.local -PrincipalsAllowedToRetrieveManagedPassword "Container Hosts" 

PrincipalsAllowedToRetrieveManagePassword的值应该是您在步骤1中创build的AD组的名称。

3)然后,在每个容器主机上:

一个。 安装Powershell Active Directory模块并testing以确定您能够使用主机上的gMSA:

 PS> Add-WindowsFeature RSAT-AD-PowerShell PS> Import-Module ActiveDirectory PS> Install-AdServiceAccount myapp PS> Test-AdServiceAccount myapp 

湾 安装证书规范Powershell模块并创build证书规范:

 PS> Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/live/windows-server-container-tools/ServiceAccounts/CredentialSpec.psm1 -OutFile CredentialSpec.psm1 PS> Import-Module .\CredentialSpec.psm1 PS> New-CredentialSpec -Name myapp -AccountName myapp 

C。 现在,如果所有configuration都正确,那么可以使用此凭据规范运行容器:

 docker run --security-opt "credentialspec=file://myapp.json" -d -p 80:80 -h myapp.mydomain.local [my-image-name:tag] 

有一件事要记住上面 – 确保创buildgMSA时使用的服务主体名称匹配容器的主机名(-h参数)。 否则,如果您的应用程序使用Windows身份validation来访问其他域资源或服务(如SQL Server),则会遇到问题。 另外,如果您打算访问其他资源(如SQL Server),请确保也为这些服务授予对gMSA帐户的相应权限。

最后,在创buildDockerfile时,不要尝试将gMSA帐户直接分配给您的应用程序池。 使用其中一个内置帐户,让引擎为您replace容器中的帐户。 换句话说,在Dockerfile中创build应用程序池应该看起来像这样:

 RUN Import-Module WebAdministration; ` New-Item -Path IIS:\AppPools\MyAppPool; ` Set-ItemProperty -Path IIS:\AppPools\MyAppPool -Name managedRuntimeVersion -Value 'v4.0'; ` Set-ItemProperty -Path IIS:\AppPools\MyAppPool -Name processModel -value @{identitytype='ApplicationPoolIdentity'}