使用Azure AD登录并获取UserManager



我有两个网站,一个"客户";包含存储在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.自动登录

现在针对复杂性:管理网站中的代码要操作";"身份";由";客户";网站为此,管理网站需要UserManagerRoleManager实例。但我知道连接UserManager或"RoleManager"的唯一方法是调用AddIdentityAddDefaultIdentity,如下所示:

// 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在代码的其他地方获得UserManagerRoleManager实例,但它关闭了通过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;
})

也许您必须在调用AddAzureAdAddAuthentication调用中使用AzureADDefaults中的相应常量来覆盖这些设置,例如:

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
options.DefaultSignInScheme = AzureADDefaults.CookieScheme; // not sure
})
.AddAzureAD(options => Configuration.Bind("AzureAd", options));

相关内容

  • 没有找到相关文章

最新更新