Как использовать как внутреннюю проверку подлинности форм, так и проверку подлинности Azure AD


В моем веб-приложении аутентификация форм реализована по умолчанию. Но для внутренних пользователей я использую AD для аутентификации. У меня была локальная реклама, выставленная по LDAP, которую я использовал только для аутентификации внутренних пользователей.

Теперь мы планируем перейти в azure. Итак, мы перешли на azure AD.

Проблема с Azure AD заключается в том, что я больше не могу использовать форму внутри своей страницы для проверки подлинности пользователей. Мне нужно перенаправить пользователя на страницу проверки подлинности Azure (в долг OpenIDConnect). Является есть способ, которым я могу получить имя пользователя / пароль в своем локальном приложении,а затем отправить их в любой api/сервис azure для проверки подлинности?

Другая проблема - теперь я не могу использовать аутентификацию форм по умолчанию в моем вебе.config или он никогда не перенаправляется на страницу проверки подлинности azure.

Кто-нибудь может помочь?

Примечание: это одно клиентское веб-приложение с несколькими пользователями

3 2

3 ответа:

Задача может быть решена с помощью OWIN CookieAuthentication и ASP.NET identity для обработки локальной аутентификации с помощью OpenIdConnect для аутентификации AzureAD.

"другая проблема - теперь я не могу использовать проверку подлинности форм по умолчанию в моем вебе.config или он никогда не перенаправляется на страницу проверки подлинности azure."

Если вы не установите <authentication mode="none" /> в web.config OWIN не может взять на себя аутентификацию / авторизацию процесс для вашего приложения из IIS.

В вашем классе Startup вам нужно будет настроить оба конвейера Identity и OpenIdConnect.

Идентичность

Если вы создаете новый проект MVC, используя отдельные учетные записи для аутентификации, вы можете увидеть автоматически сгенерированный код для класса Startup (пример ниже) в дополнение к контроллеру Account, который имеет действия Login как для прямой аутентификации, так и для ExternalLogin (третья сторона). Вы также можете посмотреть, как можно сопоставить внешний логин провайдер (AzureAD в вашем случае) для локальной учетной записи пользователя, то есть в локальном хранилище идентификаторов приложений, просматривая действия ExternalLogin и ExternalLoginCallback в контроллере Account.

Учебное пособие по настройке минимума, необходимого для аутентификации локальной идентификации.
добавление-минимального-OWIN-Identity-Authentication-к-существующему-ASPNET-MVC-приложению

OpenIdConnect

При настройке OpenIdConnect если вы устанавливаете Notification RedirectToIdentityProvider (как показано ниже) с помощью domain_hint в разделе Домены, имеющем единый вход в Azure Active Directory (портал управления Azure), пользователь должен пропустить страницу приглашения, если он уже прошел проверку подлинности на машине, присоединенной к домену.

Domain_hint - Этот параметр не является частью стандарта OpenID подключения. Лазурный Объявление ввел его, чтобы позволить вам указать, что МВУ требуется проверка подлинности пользователей с. Скажите, что ваше приложение доверяет федеративному клиенту Azure AD. С запросом по умолчанию, пользователи сначала увидят страницы проверки подлинности Azure AD и будут перенаправлены на федеративные ADFS только после того, как они введут свое имя пользователя в текстовое поле. Если вы пошлете параметр domain_hint установлен в федеративный домен, страница Azure AD пропущено, и запрос идет прямо к ADFS, связанным с арендатором. Если пользователь получает доступ к вашему приложению из интрасети и, таким образом, уже прошел проверку подлинности с помощью ADFS, это может фактически включите бесшовный единый вход в систему.

современная аутентификация с помощью Azure Active Directory для веб-приложений p.118


Вкладка домен, расположенная под вашим арендатором
Вкладка домен, расположенная под вашим клиентом


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

Http://openid.net/specs/openid-connect-core-1_0.html

Стартап.Auth

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 = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<SystemUserManager, SystemUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {

                ClientId = clientId,
                Authority = Authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,

                // Used to skip login prompt for trusted tenant

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    RedirectToIdentityProvider = async (context) =>
                    {
                        context.ProtocolMessage.DomainHint = "someDomainName";
                    },
                }
            });
        }
    }

Когда пользователь, не прошедший проверку подлинности, попытается получить доступ к защищенному коду,он будет перенаправлен на страницу входа в Azure. Один из способов справиться с этим-создать пользовательский атрибут, который направляет их на нужную страницу входа.

public class ExampleAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.User.IsInRole(this.Roles);
    }


    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
        {
            {"action", "Login"},{"controller", "Account"}
        });
    }
}


обновить до комментария

Учетные Данные Владельца Ресурса Поток Grant (то есть имя пользователя и пароль) может использоваться непосредственно в качестве разрешения авторизации, однако он должен использоваться только там, где это совершенно необходимо (см. принятый ответ) Как принимать учетные данные пользователя программно. Пример проекта аутентификация в Azure AD неинтерактивно с использованием имени пользователя и пароля

Если это просто настроенная страница входа AzureAD для достижения согласованного внешнего вида, то добавление azuread custom branding является опцией.

Непроверенные -

Можно попробовать задать параметры имени пользователя и пароля в запросе RedirectToIdentityProvider. В соответствии со спецификациейOpenIDConnect параметр prompt="none" должен указывать серверу "не отображать никаких страниц пользовательского интерфейса аутентификации или согласия" (см. код и комментарии).

Настройка промежуточного по -

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {

        ClientId = clientId,
        Authority = "https://login.windows.net/yourcompany.onmicrosoft.com",
        PostLogoutRedirectUri = postLogoutRedirectUri,                   
        Notifications = new OpenIdConnectAuthenticationNotifications()
        {                        
            RedirectToIdentityProvider = async (context) =>
            {
                context.ProtocolMessage.Username = context.OwinContext.Authentication.AuthenticationResponseChallenge.Properties.Dictionary["username"];
                context.ProtocolMessage.Password = context.OwinContext.Authentication.AuthenticationResponseChallenge.Properties.Dictionary["password"];

                // Its my understanding that setting prompt="none" should  tell the server not to display any authentication or consent user interface pages however this has not worked for me                 
                // context.ProtocolMessage.Prompt = "none";
            },
        }
    });

В вашем действии входа -

public void Login(string username, string password, string redirectUri, string loginProvider)
{
    AuthenticationProperties properties = new AuthenticationProperties();       
    properties.RedirectUri = RedirectUri;
    properties.Dictionary.Add("username", username);
    properties.Dictionary.Add("password", password);

    context.HttpContext.GetOwinContext().Authentication.Challenge(properties, loginProvider);
}

После многих исследований по этому вопросу я прихожу к выводу, что:

1) в веб-приложении невозможно передать имя пользователя / пароль непосредственно в azure AD для проверки подлинности точно так же, как это было сделано с помощью локальной службы AD (LDAP). Это не является ограничением, но может рассматриваться как реализация безопасности.

2) Самое большее, вы можете пропустить страницу портала azure с помощью RedirectToIdentityProvider и domain_hint .

3) Адал где можно пройти учетные данные пользователя в azure AD для проверки подлинности применимы только для собственных клиентов, когда собственный клиент хочет разрешить пользователю доступ к другому ресурсу (веб-api, службе и т. д.)

4) чтобы использовать azure AD поверх проверки подлинности на основе форм, необходимо установить режим проверки подлинности none в web.config и создают новый фильтр авторизации для перенаправления неавторизованных пользователей на страницу входа на основе форм. Или вы можете использовать ответ в следующем URL-адресе: перенаправление пользователь на пользовательской странице входа в систему при использовании Azure AD

В дополнение к решению от cID, взгляните на Azure B2C для хранения ваших пользователей: https://azure.microsoft.com/en-us/documentation/articles/active-directory-b2c-overview/

В B2C у вас есть база данных OWIN/OpenID Connect, полная пользователей, но вам придется перенести туда существующую базу данных форм.

Второй частью этого решения является библиотека preview MSAL, которая объединяет логины AD и B2C