Единый вход с AD / ADFS и собственным клиентом .NET - PullRequest
0 голосов
/ 14 февраля 2019

Мой вопрос касается Active Directory (AD), служб федерации Active Directory (ADFS), Single Sing On (SSO) и SAML.

У нас есть клиент-серверное приложение со следующими спецификациями: - Клиент: Собственный клиент WPF .NET на основе .NET 4.7.2 и C # - сервер: REST-служба на основе Java Spring

Одним из основных требований является единый вход с AD / ADFS.В лучшем случае пользователь должен пройти аутентификацию без шуток / без звука.

Основное ограничение - AD и ADFS на основе Windows Server 2012 R2.

На следующем рисунке вы можете узнать, как мы планировали внедрить SSOс ADFS.

SSO-сценарий

  • Собственный клиент .NET пытается использовать REST-сервис без аутентификации.
  • Служба REST перенаправляет собственный клиент .NET на сервер ADFS.
  • Собственный клиент .NET пытается получить SAML-токен с текущими зарегистрированными учетными данными пользователя (вход в Windows).
  • Если текущему пользователю не предоставлено, ADFS-сервер отвечает иSAML-токен.
  • Собственный клиент .NET берет SAML-токен и передает его в REST-сервис.
  • Если SAML-токен принят, доступ пользователя предоставляется.
  • Если SAML-токен не принят, пользователь должен получить экран входа в приложение.

В настоящее время я полностью запутался в отношении единого входа с ADFS в .NET Native Client.Я не могу найти подходящих демонстраций и т. Д. Многие демонстрации или примеры использования касаются ASP.NET, но почти ничего не говорят о нативных клиентах.Я начинаю задумываться, не верны ли мои предположения о SSO с AD / ADFS и SAML.

Я начал создавать AD-ADFS-Lab с виртуальными машинами, описанными в Общие сведения о ADFS и введение в ADFS .Затем я пытаюсь поиграть с ADFS-сервером, но не могу этого сделать.

Я смотрю на следующие библиотеки:

После 1 недели исследований у меня кружится голова:

  • Нужен ли WIF?
  • А как насчет WCF?

Я знаю, что есть OAuth.Я знаю, что Windows Server 2012 не самый последний и лучший для этого сценария.Но Требования и Ограничения исходят непосредственно от нашего Клиента.

  • Что я могу сделать?
  • Что я могу прочитать или попробовать?
  • Есть ли другие библиотеки?
  • Есть ли Examplex?

Обновление

Мне удалось "поговорить" с моим ADFS-сервером с помощью WS-Trust и получить SAML-токен.

private static void Main(string[] args)
    {
        string adfs = "https://ad-fs.adlab.local";
        string adfsEndpoint = "https://ad-fs.adlab.local/adfs/services/trust/13/usernamemixed";
        string appServer = "https://ad-server.adlab.local/sampapp/";

        var factory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), adfsEndpoint);
        factory.TrustVersion = TrustVersion.WSTrust13;

        var channelCredentials = factory.Credentials;

        channelCredentials.UserName.UserName = "Administrator@adlab";
        channelCredentials.UserName.Password = "SsoLab2019";
        channelCredentials.SupportInteractive = false;

        RequestSecurityToken rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointReference(appServer),
            KeyType = KeyTypes.Bearer
        };

        var channel = factory.CreateChannel();

        try
        {
            var token = (GenericXmlSecurityToken)channel.Issue(rst);
            Console.Write(token.TokenXml.OuterXml);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadKey();
    }

Нет, мне нужно выяснить, как я могу получить SAML-токен без вывода сообщений /бесшовные.

...