Проверка подлинности Azure AD в ASP.NET MVC 5 - PullRequest
0 голосов
/ 10 мая 2018

Моя проблема заключается в том, что я не могу заставить работать аутентификацию Azure AD при создании регистраций приложений (на портале Azure) вручную.

Все работает нормально, если я создаю новый веб-сайт с использованием шаблона MVC 5 и позволяю Visual Studio (2017) создать новую регистрацию приложения.

enter image description here

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

enter image description here

трассировка стека:

в Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext () --- Конец стека трассировки из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задача) Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.d__3.MoveNext () --- Конец стека трассировки из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задача) в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Задача)
в Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext ()

Код запуска, который я использую в обоих:

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string tenant = ConfigurationManager.AppSettings["ida:TenantId"];
    private string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                RedirectUri = postLogoutRedirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                },
                TokenValidationParameters = new TokenValidationParameters
                {

                    RequireSignedTokens = false,

                },
            });
    }

Единственное отличие, которое мне удалось обнаружить, заключается в том, что автоматически созданная регистрация приложения имеет один ключ, а его манифест содержит "passwordCredentials".

enter image description here

Приложение, созданное вручную, не имеет его. Я использую IIS Express для обоих сайтов. И идентификатор приложения, и идентификатор арендатора верны, а также порт HTTPS. Все пакеты OWIN имеют одинаковую версию (в обоих приложениях). Я думаю, что IIS Express каким-то образом использует этот ключ сверху, но я не мог найти, где и как он применяется, поскольку мой код запуска точно такой же. Любая помощь приветствуется

PS: Я также пытался разместить его на локальном IIS с тем же результатом ...

1 Ответ

0 голосов
/ 12 мая 2018

Я не смог заставить его работать с идентификатором арендатора (все еще не знаю почему), но когда я использую имя арендатора, он, наконец, работает с созданной вручную регистрацией приложения.

public partial class Startup
{
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    private string authority = string.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

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

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                RedirectUri = postLogoutRedirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                }
            });
    }
}
...