.NET Core проверка подлинности Windows в Docker-контейнере - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу создать контейнер из моего .NET Core веб-приложения (состоит из нескольких проектов), в котором используется Аутентификация Windows .Вот мой Dockerfile :

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
COPY Solution.sln ./
COPY Project1/*.csproj ./Project1/
COPY Project2/*.csproj ./Project2/
COPY Project3/*.csproj ./Project3/
COPY Project4/*.csproj ./Project4/
COPY Project5/*.csproj ./Project5/

RUN dotnet restore
COPY . .

WORKDIR /Project1
RUN dotnet build -c Release -o /app

WORKDIR /Project2
RUN dotnet build -c Release -o /app

WORKDIR /Project3
RUN dotnet build -c Release -o /app

WORKDIR /Project4
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Project4.dll"]

Если я запускаю контейнер, веб-сайт открывается, но не открывается диалог входа в систему и информация пользователя отсутствует.Какой самый простой способ включить проверку подлинности Windows в контейнере Docker?

1 Ответ

0 голосов
/ 13 февраля 2019

По своей природе ваш контейнер изолирован и не принадлежит вашему домену, что делает проверку подлинности Windows хорошо известной проблемой.Способ достижения этого - использование недавно представленной Microsoft технологии под названием gMSA, https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831782(v=ws.11)

О том, как использовать ее с Docker: https://www.axians -infoma.de / techblog / windows-authentication-in-docker-Containers-Just-Get-A-LOT-проще / https://artisticcheese.wordpress.com/2017/09/09/enabling-integrated-windows-authentication-in-windows-docker-container/

Для запроса Марк, вы также можете использовать кусок кода с использованием LDAP:

private bool VerifyServerCertificateCallback(LdapConnection connection, X509Certificate certificate)
{
return new X509Certificate2(certificate).Verify();
}

public bool ValidateCredentials(string userName, string password)
{
try
{
var ldapDirectoryIdentifier = new ldapDirectoryIdentifier(ldapServer.ServerAddress);

var ldapConnection = new LdapConnection(ldapDirectoryIdentifier) { AuthType = AuthType.Basic };
ldapConnection.SessionOptions.ProtocolVersion = 3;
ldapConnection.SessionOptions.SecureSocketLayer = true;
ldapConnection.SessionOptions.VerifyServerCertificate = VerifyServerCertificateCallback;

ldapConnection.Bind(new NetworkCredential(string.Format(ldapServer.UserLocation, userName), password));

ldapConnection.Dispose();
}
catch (Exception exception)
{
continue;
}
return true;
}

И в вашем контроллере:

if (ValidateCredentials(username, password))
{
ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(
                new List<Claim>{
                    new Claim(ClaimTypes.Name, username),
                    ...
                },
                "...");

            await 
HttpContext.SignInAsync(AuthSchemeName, principal);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...