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

Cha*_*wen 9 windows asp.net authentication iis docker

我已经从microsoft/aspnet存储库创建了一个容器. 我想在IIS中容纳一个ASP.NET 4.x Web应用程序,我可以在其中获取访问该站点的登录用户.我希望能够利用集成的Windows身份验证,因为这是一个内部应用程序.

我已经为容器主机创建了一个透明的网络.

另外,我在容器内的IIS上设置了Windows身份验证.我已经阅读了有关在容器主机上创建组托管服务帐户的内容,但我还没有这样做,并且不确定这是否足够,或者我不得不采取进一步措施.

小智 11

创建组托管服务帐户(gMSA)只是您需要采取的步骤之一,以使Windows身份验证与容器一起使用.您还需要一个凭据规范,其中包含有关您创建的gMSA的信息,并且容器将使用它来交换应用程序的应用程序池使用的内置帐户(LocalSystem,NetworkService,ApplicationPoolIdentity)的gMSA帐户.

实际上,最小的步骤是:

1)创建一个AD组,您可以使用该组添加将用于托管容器的计算机.

PS> New-ADGroup "Container Hosts" -GroupScope Global
PS> $group = Get-ADGroup "Container Hosts"
PS> $host = Get-ADComputer "mydockerhostmachine"
PS> Add-ADGroupMember $group -Members $host
Run Code Online (Sandbox Code Playgroud)

2)创建用于您的应用的gMSA帐户:

PS> New-ADServiceAccount -name myapp -DNSHostName myapp.mydomain.local -ServicePrincipalNames http/myapp.mydomain.local -PrincipalsAllowedToRetrieveManagedPassword "Container Hosts"
Run Code Online (Sandbox Code Playgroud)

PrincipalsAllowedToRetrieveManagePassword应为您在步骤1中创建的AD组的名称.

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

一个.安装Powershell Active Directory模块并进行测试,以确保您能够使用主机中的gMSA:

PS> Add-WindowsFeature RSAT-AD-PowerShell    
PS> Import-Module ActiveDirectory    
PS> Install-AdServiceAccount myapp    
PS> Test-AdServiceAccount myapp
Run Code Online (Sandbox Code Playgroud)

湾 安装Credential Spec Powershell模块并创建凭证规范:

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
Run Code Online (Sandbox Code Playgroud)

C.现在,如果一切都配置正确,您可以使用此凭据规范运行容器:

docker run --security-opt "credentialspec=file://myapp.json" -d -p
80:80 -h myapp.mydomain.local [my-image-name:tag]
Run Code Online (Sandbox Code Playgroud)

要注意以上事项 - 确保在创建gMSA时使用的服务主体名称与容器的主机名(-h参数)匹配.否则,如果您的应用程序使用Windows身份验证访问其他域资源或服务(例如,SQL Server),则会出现问题.此外,如果要访问SQL Server等其他资源,请确保还为这些服务提供gMSA帐户的相应权限.

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

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'}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在将容器主机添加到“容器主机”组之后,以及在容器主机上安装服务帐户之前,似乎需要重新启动容器主机 (3认同)