Подтвердить что ты не робот

Используйте пакет OWIN Ws-Federation для аутентификации с помощью ADFS 3.0

У меня есть сайт интрасети MVC, который должен использовать учетные записи AD для аутентификации.

Я настраиваю ADFS 3.0 (Win Server 2012 R2) и следую this, чтобы настроить Trust ADSL Relying Party Trust.

Этот другой пост представляет компоненты WW-федерации OWIN, и я хотел бы использовать его. В нем упоминается, как подключиться к Azure AD, но ничего относительно ADFS.

Я попытался настроить свойства конфигурации "MetadataAddress" и "Wtrealm" в соответствии с тем, что я настроил в ADFS, но во время выполнения я получаю сообщение об ошибке:

A default value for SignInAsAuthenticationType was not found in IAppBuilder Properties. 
This can happen if your authentication middleware are added in the wrong order, or if one is missing.

Я ищу правильный способ удалить эту ошибку

4b9b3361

Ответ 1

Да... Я столкнулся с той же проблемой. Просто выполните следующее, и он должен работать:

    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType );

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
       AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
    });

Ответ 2

Я пытаюсь задуматься об этом некоторое время и с благодарностью специально Ларс Кемманн и Tratcher, я считаю, что принятый способ сделать это выглядит следующим образом:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(
    new CookieAuthenticationOptions { }
);

app.UseWsFederationAuthentication(
    new WsFederationAuthenticationOptions
    {
        Wtrealm = ConfigurationManager.AppSettings["ida:Wtrealm"],
        MetadataAddress = ConfigurationManager.AppSettings["ida:FedMetadataURI"]
    }
);

Кажется противоречивым, что вы настраиваете тип аутентификации по умолчанию как "аутентификация cookie", чтобы заставить WsFederation работать, однако это действительно просто строки, используемые для идентификации каждого фрагмента промежуточного программного обеспечения (это позволяет вам регистрировать один и тот же тип промежуточного программного обеспечения несколько раз, например), они оцениваются следующим образом:

  • CookieAuthenticationDefaults.AuthenticationType= "Cookies"
  • WsFederationAuthenticationDefaults.AuthenticationType= "Федерация"

Что здесь происходит, мы говорим OWIN, что промежуточное ПО, помеченное как "Cookies" , должно использоваться по умолчанию для аутентификации запросов, мы добавляем промежуточное ПО CookieAuthentication (по умолчанию это помечено как "Cookies" из значения CookieAuthenticationDefaults.AuthenticationType, поэтому нам не нужно писать какой-либо дополнительный код для его настройки), наконец мы добавим промежуточное ПО FederationAuthentication (это обозначено как WsFederationAuthenticationDefaults.AuthenticationType - ie "Federation" ), я понимаю, что промежуточное программное обеспечение федерации использует промежуточное ПО Cookie для управления своими файлами, связанными с проверкой подлинности.

Все, что осталось сделать, это настроить ваше приложение для вызова промежуточного программного обеспечения в любое время по вашему выбору, это может быть достигнуто несколькими способами, некоторые из которых следующие:

  • Возвращая ответ HTTP 401
  • Используя атрибут [Authorize] на контроллере MVC
  • Вызов метода OWIN Context IAuthenticationManager Challenge (передача в метке промежуточного программного обеспечения вашей федерации)

Когда я задал этот вопрос здесь, Ларс ответил аккуратным примером того, как запрашивать аутентификацию для всех запросов, затем я связал его с конвейером OWIN следующим образом

app.Use(
    (context, continuation) =>
    {
        if (
            (context.Authentication.User != null) &&
            (context.Authentication.User.Identity != null) &&
            (context.Authentication.User.Identity.IsAuthenticated)
        )
        {
            return continuation();
        }
        else
        {
            context.Authentication.Challenge(WsFederationAuthenticationDefaults.AuthenticationType);

            return Task.Delay(0);
        }
    }
);

Обратите внимание, что в первом примере выше я переместил значения Wtrealm и MetadataAddress в мой файл конфигурации для упрощения обслуживания, это просто простые настройки приложения:

<appSettings>
    <add key="ida:Wtrealm" value="[app-uri]" />
    <add key="ida:FedMetadataURI" value="https://[adfs-server]/federationmetadata/2007-06/federationmetadata.xml" />
</appSettings>

Надеюсь, это поможет.

Ответ 3

На самом деле вам просто не хватает этой строки, которая обычно перед вызовом метода UseCookieAuthentication.

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

в вашем случае это будет

app.UseExternalSignInCookie(WsFederationAuthenticationDefaults.AuthenticationType);

Это то, что фактически выполняется, когда вы вызываете UseExternalSignInCookie (...), внешнийAuthenticationType - это то, что вы передаете в качестве строкового параметра.

app.SetDefaultSignInAsAuthenticationType(externalAuthenticationType);
CookieAuthenticationOptions options = new CookieAuthenticationOptions();
options.AuthenticationType = externalAuthenticationType;
options.AuthenticationMode = AuthenticationMode.Passive;
options.CookieName = ".AspNet." + externalAuthenticationType;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0);
app.UseCookieAuthentication(options);

Итак, если все, что вы устанавливаете, это AuthenticationType, вы можете просто просто вызвать UseExternalSignInCookie, как он это делает для вас.