如何结合EntityFrameworkStores管理用户账户并访问Microsoft Graph?
如何结合本地Identity管理与Microsoft Graph访问(委派权限模式)
问题背景
应用基于Microsoft Identity(非WebApp Identity),通过本地数据库+AddDefaultIdentity、EntityFrameworkStores组件实现用户认证与授权管理;现在需要访问Microsoft Graph,尝试使用AddMicrosoftIdentityWebApp相关代码实现Graph认证,但发现该代码依赖会与本地Identity配置冲突,不清楚如何同时实现:
- 保留本地数据库的Identity用户授权体系
- 获取Microsoft Graph的访问权限(必须使用委派权限,禁止应用权限以避免过度授权)
现有代码如下:
builder.Services.AddDbContext<InvoiceAuditingContext>(options => options.UseSqlServer( builder.Configuration.GetConnectionString("DefaultConnection"))); // Identity builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<ApplicationRole>() .AddUserStore<UserStore<ApplicationUser, ApplicationRole, InvoiceAuditingContext, Guid>>() .AddRoleStore<RoleStore<ApplicationRole, InvoiceAuditingContext, Guid>>() .AddEntityFrameworkStores<InvoiceAuditingContext>(); // Authentication for Microsoft Graph? builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph")) .AddInMemoryTokenCaches();
解决方案思路
核心逻辑是:本地Identity负责应用内的用户认证与授权,同时通过Microsoft Identity的令牌获取机制,在用户登录后获取针对当前用户的Graph委派权限令牌,不替换原有本地Identity体系。
修正后的代码示例
builder.Services.AddDbContext<InvoiceAuditingContext>(options => options.UseSqlServer( builder.Configuration.GetConnectionString("DefaultConnection"))); // 1. 保留本地Identity配置(应用内用户管理核心) builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<ApplicationRole>() .AddUserStore<UserStore<ApplicationUser, ApplicationRole, InvoiceAuditingContext, Guid>>() .AddRoleStore<RoleStore<ApplicationRole, InvoiceAuditingContext, Guid>>() .AddEntityFrameworkStores<InvoiceAuditingContext>(); // 2. 配置Microsoft Identity用于Graph令牌获取(设置独立Scheme避免冲突) builder.Services.AddAuthentication() .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"), openIdConnectScheme: "MicrosoftIdentity", // 指定独立认证Scheme,不覆盖本地Identity的默认Cookie Scheme cookieScheme: null) // 沿用本地Identity的Cookie,不新增独立Cookie .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph")) .AddInMemoryTokenCaches(); // 3. 可选:定义访问Graph的授权策略 builder.Services.AddAuthorization(options => { options.AddPolicy("AccessMicrosoftGraph", policy => { policy.RequireAuthenticatedUser(); policy.AddAuthenticationSchemes("MicrosoftIdentity"); }); });
关键细节说明
- 委派权限保障最小权限:使用委派权限时,Graph请求始终以当前登录用户的身份发起,权限范围严格匹配用户自身权限,避免应用权限带来的过度授权风险。
- 令牌缓存优化:
AddInMemoryTokenCaches用于缓存已获取的Graph令牌,减少重复认证请求;生产环境建议替换为分布式缓存(如Redis)。 - 触发Graph认证:在需要访问Graph的控制器/页面中,使用
[Authorize(AuthenticationSchemes = "MicrosoftIdentity")]特性,或手动触发认证挑战,引导用户完成Microsoft Identity认证以获取令牌。 - 用户账号关联:若需将本地Identity用户与Microsoft Identity账号绑定,可在用户首次完成Microsoft Identity认证后,将其Azure AD ObjectId存储到本地
ApplicationUser实体中,实现账号关联。
内容的提问来源于stack exchange,提问作者Andrew Casey
相关产品推荐
相关产品推荐

