You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:03:22