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

时间:2017-11-16 19:49:51

标签: asp.net windows authentication docker iis

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

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

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

1 个答案:

答案 0 :(得分:10)

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

实际上,最小的步骤是:

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

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

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

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

湾安装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

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

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

上面要记住的一件事 - 确保在创建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'}