Как реализовать единый вход в систему (ADFS) в ASP.NET MVC - PullRequest
0 голосов
/ 05 февраля 2019

FYI: см. Обновление 12-FEB-2019

Я создал приложение ASP.NET MVC (с помощью Visual Studio) и попытался заставить его обрабатывать единый вход с помощью федеративного сервера Active Directory.Обратите внимание, это , а не с использованием Azure.

Итак, первый шаг работает - я перехожу на свою страницу входа и есть кнопка, позволяющая мне войти в другой сервис ["Федерация"],При этом запускается веб-страница ADFS, где я ввожу свои учетные данные, но по возвращении на свой веб-сайт я получаю следующую ошибку:

IDX10214: проверка аудитории не выполнена.Аудитория: «[PII скрыт]».Не соответствует: validationParameters.ValidAudience: '[PII скрыт]' или validationParameters.ValidAudiences: '[PII скрыт]'.

Сведения об исключении: Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: Audience214,Аудитория: «[PII скрыт]».Не соответствует: validationParameters.ValidAudience: '[PII скрыт]' или validationParameters.ValidAudiences: '[PII скрыт]'.

Очевидно, я не настроил это правильно ..... так что нужно знать, что мне не хватает ...

Вот мой (урезанный) код:

Startup.Auth.cs

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);    

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

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

        app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
        {
            MetadataAddress = "https://adfs.Mydomain.com/FederationMetadata/2007-06/FederationMetadata.xml",
            Wtrealm = "https://myWebServer/myWebApplication"
        });
    }

    private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
    {
        return true; // Our "TEST" ADFS has a fake certficate, so we don't want to validate it.
    }
}

Разделы в Web.Config

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

    <add key="ClaimsNameIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" />
    <add key="ClaimsUPNIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" />
    <add key="ClaimsEmailIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" />
  </appSettings>

  <system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.7.1" />
    <httpRuntime targetFramework="4.7.1" />
  </system.web>

(Примечание: в вышеприведенном элементе аутентификации intellisense дал мне «Federated» в качестве опции, но это приводит кошибка компиляции).

Одним из полезных ресурсов был alligatortek , но он не заполнил все части.Есть и другие ресурсы, которые кажутся близкими, но недостаточно конкретными.

ОБНОВЛЕНИЕ 12-ФЕВРАЛЬ-2019

Основываясь на комментариях ниже, мне посоветовали вместо этого следовать Сообщение Витторио Берточчи , в котором используется опция «Pre-Premesis» (это очень похоже на сообщение Робера Финча ).Результирующий код немного отличается (см. Ниже), но результат остается тем же.

Startup.Auth.cs

public partial class Startup
{
    private static readonly string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
    private static readonly string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];

    /// <summary>
    ///     Configures the authentication.
    /// </summary>
    /// <param name="app">The current application.</param>
    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        ServicePointManager.ServerCertificateValidationCallback = this.ValidateServerCertificate;
        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = Startup.realm,
                MetadataAddress = Startup.adfsMetadata
            });
    }

    private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
    {
        return true; // Skips certificate validation as using a temp certificate.
    }
}

Разделы вWeb.Config

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="ida:ADFSMetadata" value="https://adfs.Mydomain.com/FederationMetadata/2007-06/FederationMetadata.xml" />
    <add key="ida:Wtrealm" value="https://myWebServer/myWebApplication" />
</appSettings>

Ответы [ 2 ]

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

Наконец-то решил эту проблему.

В файле Startup.Auth.cs я временно добавил следующую строку в метод ConfigAuth (...):

Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;

Это показаломне, что я должен был добавить косую черту к значению "Wtrealm" в записи web.config

Так от:

<add key="ida:Wtrealm" value="https://myWebServer/myWebApplication" />

до:

<add key="ida:Wtrealm" value="https://myWebServer/myWebApplication/" />
0 голосов
/ 06 февраля 2019

Самый простой способ сделать это - использовать опцию " On-Premises " в VS.

...