Azure AD是“外部提供者”吗?

时间:2019-08-18 02:18:03

标签: c# azure azure-active-directory asp.net-identity asp.net-core-2.0

我正在尝试构建一个简单的ASP.Net Core 2.2 Web应用程序,以允许AzureAD作为“外部提供程序”。我正在Visual Studio 2019中执行此操作。

作为一个超简单的演示项目,我首先创建一个使用Azure AD作为登录提供程序的新项目:

  1. 选择ASP.NET Core Web应用程序
  2. 选择Web应用程序(模型-视图-控制器)
  3. 将身份验证更改为“工作或学校帐户”。它会自动填写我的域名(因为我已登录VS)

这将创建一个Web应用程序,该应用程序设置为在所有页面上强制执行用户身份验证。当我运行该应用程序时,它将转到Azure AD并登录我,然后导航到/home页。

回想一下,我说过我想将Azure AD添加为外部提供商。所以我在Startup.cs中找到了这一行:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

并且我删除了默认的身份验证方案以防止自动登录,

services.AddAuthentication()
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

现在,当我运行该应用程序时,它会导航到Login页,并且为我提供了一个蓝色的大按钮,让我可以使用Azure Active Directory登录。但是,单击该按钮不会使我登录

因此,我搭建了Identity页面,并在ExternalLogin GET例程中设置了一个断点。果然,单击蓝色的大按钮便找到了它的出路。逐步查看代码,我发现_signInManager.GetExternalLoginInfoAsync()的调用返回null

我被困住了。显然,(未公开的)配置魔术无法正确设置某些内容来满足对GetExternalLoginInfoAsync的调用。

1 个答案:

答案 0 :(得分:0)

该方案是您将asp.net身份与Azure AD登录一起用作外部身份提供程序。

您应该将IdentityConstants.ExternalScheme设置为Azure AD身份验证的登录架构,以便可以使用_signInManager.GetExternalLoginInfoAsync()获取外部用户信息:

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores<ApplicationDbContext>();

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => {
    options.SignInScheme= IdentityConstants.ExternalScheme;

    //other config
});

然后,您可以设置asp.net身份并进行修改以满足您的要求,在任何页面中触发外部登录(OnPost中的ExternalLogin.cshtml.cs函数)作为默认模板(“蓝色大按钮”)确实。