Asp.net 使用密码和 Azure Active Directory 身份验证的身份

Asp.net Identity using password and Azure Active Directory authentication

我正在使用 Asp.net Identity (OWIN) 构建一个 ASP.NET MVC 5 网站,并希望支持传统的 username/password 身份验证以及针对 Azure Active Directory 的身份验证。此应用不需要针对 Microsoft ID(Live ID)、Facebook、Twitter 或任何其他外部提供商进行身份验证。我发现的最接近的问题是这个:How to do both Azure Active Directory Single Sign On and Forms Authentications on ASP.NET MVC

我查看了使用 "Individual User Accounts" 选项以及 VS 2015 中的 "Work and School Accounts" 选项创建项目时创建的示例。我的身份验证单独运行良好;只有当我尝试将它们组合起来时,我才 运行 遇到问题。

在我的 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 { });

我猜想对此有一个相对简单的方法,希望能提供一些关于从哪里开始寻找的想法。

我从微软搜索了例子。所有这些看起来都像您的解决方案。看这里:

  1. WebApp-WSFederation-DotNet
  2. WebApp-MultiTenant-OpenIdConnect-DotNet
  3. WebApp-OpenIDConnect-DotNet

另一个例子是 hereWindowsAzureActiveDirectoryBearerAuthenticationOptions

最近 ASP.NET 团队的 Damian Edwards 开源了他们的 community standup website on github。他们正在使用 Azure AD,所以我希望它能在正确的方向上有所帮助,不幸的是我对 Azure AD 没有任何经验。

这里也是 youtube video of the standup 他们谈论它的地方,我认为这里有一些提示,也许您可​​以利用它们。

我意识到这是一个老问题。我可能希望对多个 Azure AD 租户执行类似但可能更像是 ASP.Net 身份验证的操作。我在 Integrating Azure AD into ASP.NET Core 中找到了这条语句:

...then leverage the OnTokenValidated notification to implement your own issuer validation logic depending on which tenants you want to support (any tenant, Microsoft Account + specific list of Azure AD, single Azure AD, just Microsoft Account, etc)...

让我相信那里的示例代码可能是这种混合身份验证方案的关键。