Идентификация Asp.net с использованием пароля и аутентификация Active Directory в Active Directory

Я создаю веб-сайт ASP.NET MVC 5 с использованием Asp.net Identity (OWIN) и хочу поддерживать как традиционную аутентификацию имени пользователя, так и пароль, а также аутентификацию с помощью Azure Active Directory. Это приложение не нуждается в аутентификации против идентификаторов Microsoft (Live ID), Facebook, Twitter или любого другого внешнего поставщика. Ближайшим вопросом SO, который я нашел, является следующий: Как выполнить однократный вход в Azure Active Directory и аутентификацию форм на ASP.NET MVC

Я просмотрел образцы, которые создаются при создании проекта с использованием опции "Индивидуальные учетные записи пользователей", а также опции "Работа и учеба" в VS 2015. У меня есть аутентификация, работающая хорошо индивидуально; это только когда я пытаюсь объединить их, что у меня проблемы.

В моем файле Startup_Auth.cs я настраиваю OWIN следующим образом:

    public void ConfigureAuth(IAppBuilder app)
    {

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        //app.UseCookieAuthentication(new CookieAuthenticationOptions { });

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
            LoginPath = new PathString("/account/sign-in")
        });

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateIssuer = false,
                },
                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    SecurityTokenValidated = (context) => 
                    {
                        return Task.FromResult(0);
                    },
                    AuthorizationCodeReceived = (context) =>
                    {
                        return Task.FromResult(0);
                    },
                    AuthenticationFailed = (context) =>
                    {
                        context.OwinContext.Response.Redirect("/Home/Error");
                        context.HandleResponse(); // Suppress the exception
                        return Task.FromResult(0);
                    }
                }
            }
        );
    }  

Эта конфигурация работает для аутентификации паролей, но не работает для аутентификации AAD. Чтобы включить аутентификацию AAD, мне нужно либо прокомментировать строку, задающую параметр AuthenticationType

AuthenticationType = DefaultAuthenticationTypes.ExternalCookie,

Или просто установите CookieAuthentication без значений.

app.UseCookieAuthentication(new CookieAuthenticationOptions { });

Я бы предположил, что существует относительно простой подход к этому, и я бы оценил некоторые идеи о том, где начать искать.

Ответы

Ответ 2

Совсем недавно Дамиан Эдвардс из команды ASP.NET открыл свой веб-сайт сообщества на github. Они используют Azure AD, поэтому я надеюсь, что это поможет в правильном направлении, я, к сожалению, не имею никакого опыта с Azure AD.

Вот также youtube video standup, где они говорят об этом, я думаю, что есть несколько советов и, возможно, подсказки, которые вы можете быть в состоянии использовать.

Ответ 3

Я понимаю, что это старый вопрос. Я потенциально хочу сделать что-то подобное, но, вероятно, больше похоже на аутентификацию ASP.Net для более чем одного арендатора Azure AD. Я нашел это Интеграция Azure AD в ASP.NET Core, где это утверждение:

... затем используйте уведомление OnTokenValidated для реализации собственной логики проверки эмитента, в зависимости от того, какие арендаторы вы хотите поддерживать (любой арендатор, учетная запись Microsoft + конкретный список Azure AD, один Azure AD, только учетная запись Microsoft и т.д.)...

заставляет меня поверить, что пример кода может содержать ключ к этому смешанному сценарию auth.