我有两个网站,一个"客户";包含存储在SQL Server数据库中的Identity表中的本地用户的网站;管理;网站通过我们的Azure AD登录用户。这两个网站共享SQL数据库的共同视图(我将迁移和DbContext放在一个共享库中(。
如果用户未通过身份验证,我的管理网站希望自动将其重定向到Azure AD。这是在Startup.cs中通过:完成的
// Use AzureAD for authentication
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
到目前为止,一切都很好。。。上面的代码导致网站通过我的Azure AD.自动登录
现在针对复杂性:管理网站中的代码要操作";"身份";由";客户";网站为此,管理网站需要UserManager
和RoleManager
实例。但我知道连接UserManager
或"RoleManager"的唯一方法是调用AddIdentity
或AddDefaultIdentity
,如下所示:
// Configure Identity
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
// Use AzureAD for authentication
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
这允许我使用DI在代码的其他地方获得UserManager
或RoleManager
实例,但它关闭了通过Azure AD的自动登录,并尝试重定向到身份登录页面(在我的"管理"网站中,该页面不存在(。
如何在保留Azure AD自动登录行为的同时配置身份
编辑:
微软技术支持部门正在对此进行研究。当我从他们那里得到答案时,我会公布的。
使用AddIdentityCore并像下面的一样分别注入UserManager和RoleManager
services.AddIdentityCore<AppUser>(options =>
options.SignIn.RequireConfirmedAccount = false)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<AppUserContext>();
services.AddScoped<UserManager<AppUser>>();
services.AddScoped<RoleManager<IdentityRole>>();
services.AddScoped<IRoleStore<IdentityRole>, RoleStore<IdentityRole, ApplicationDbContext>>();
AddIdentityCore 参考
AddIdentity和AddIdentityCore之间的差异参见
Github样本在这里
您的授权控制器的默认授权策略中似乎使用了身份验证主题Identity.Application
。尝试明确设置默认授权策略以使用AzureAD身份验证主题,例如:
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(AzureADDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
});
编辑:看看GitHub上IdentityServiceCollectionExtension.cs中的AddIdentity
扩展方法,在该方法中,AddAuthentication被称为:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
也许您必须在调用AddAzureAd
的AddAuthentication
调用中使用AzureADDefaults
中的相应常量来覆盖这些设置,例如:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
options.DefaultSignInScheme = AzureADDefaults.CookieScheme; // not sure
})
.AddAzureAD(options => Configuration.Bind("AzureAd", options));