我正在尝试构建一个简单的ASP.Net Core 2.2 Web应用程序,以允许AzureAD作为“外部提供程序”。我正在Visual Studio 2019中执行此操作。
作为一个超简单的演示项目,我首先创建一个使用Azure AD作为登录提供程序的新项目:
这将创建一个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
的调用。
答案 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
函数)作为默认模板(“蓝色大按钮”)确实。