在 AspnetCore Identity 中使用 Microsoft Identity Platform 作为外部身份验证提供程序

Use Microsoft Identity Platform as External Auth provider in AspnetCore Identity

我通过 Microsoft.AspnetCore.Authentication.OpenIdConnect 和调用

成功地将 Azure AD 和 Office365 用作 AspNet-Core Identity 中的登录提供程序
AddRemoteScheme<OpenIdConnectOptions, OpenIdConnectHandler>("AzureAD","Office 365",_=> { })

然后我为 OpenIdConnectOptions 添加一个 PostConfigureOptions 处理程序,以将其设置为与 Azure 一起使用。这会在登录页面添加一个“使用 Office 365 登录”按钮并且可以正常工作,但必须有更简单的方法。

我很好奇是否可以使用 Microsoft.Identity.Web,但我无法让它在我的测试中正常工作。

在 VS 2022 中使用适用于 dotnet 6 的 Aspnet-Core 模板并选择个人帐户进行身份验证,您将搭建一个项目,其中 AspNet-Core Identity 配置为将 IdentityDbContext 与本地帐户一起使用。

当 运行 应用程序并登录时,您会看到一个空的外部身份验证提供程序列表和 link Microsoft 文档中关于在此处添加外部身份验证提供程序的内容:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/?view=aspnetcore-6.0&tabs=visual-studio

为了测试Microsoft.Identity.Web包,我打电话给:

builder.Services.AddAuthentication().AddMicrosoftIdentityWebApp(config.GetSection("AzureAD"))

在Programs.cs

这适用于添加身份验证提供程序,我现在在“使用其他服务登录”下看到一个“OpenIdConnect”按钮。点击导致失败“Error loading external login information.”

尝试通过单击按钮登录时,我收到“加载外部登录信息时出错”。来自 Microsoft Identity UI 的 ExternalLogin.cshtml.cs 中的第 107 行始终为空:

var info = await _signInManager.GetExternalLoginInfoAsync();

是否可以向 .AddMicrosoftIdentityWebApp() 提供正确的参数,使其使用最少的代码和配置作为外部身份验证提供程序与 AspNet-Core Identity 一起工作?

在研究了源代码之后,解决方案很简单。这是一个有效的扩展方法,它将配置 Microsoft.Identity.Web 用作具有 AspNet-Core Identity:

的永久身份验证提供程序
public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddOffice365Identity<TContext,TUser>(
        this IServiceCollection services,
        IConfigurationSection config,
        Action<IdentityOptions>? options = null)
          where TContext : IdentityDbContext
          where TUser : class
    {

      //Setup Default Identity
      var identityBuilder = options == null ?
        services.AddDefaultIdentity<TUser>()
        : services.AddDefaultIdentity<TUser>(options);
    
      identityBuilder.AddEntityFrameworkStores<TContext>();

     //Add Microsoft.Identity.Web 
     services
        .AddAuthentication()
        .AddMicrosoftIdentityWebApp(config,displayName: "Office 365")
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddMicrosoftGraph()
        .AddInMemoryTokenCaches();

      //This is the important part: Change the SignInScheme to External
      //After ALL other configuration have run.
      //Claim mapper maps all claims and adds the ClaimTypes.Email claim.
      services
        .AddOptions()
        .PostConfigureAll<OpenIdConnectOptions>(o => {
        o.SignInScheme = IdentityConstants.ExternalScheme;            
        o.ClaimActions.Add(new ClaimMapper());
      });

      return services;
  }
}

运行 如果您的 appconfig 具有通常的配置,您最终将得到一个有效的“Office 365”配置:

"AzureAd": {
  "CallbackPath": "/signin-oidc",
  "ClientSecret": "[client_secret]",
  "ClientId": "[client_id]",
  "Domain": "[domain]",
  "Instance": "https://login.microsoftonline.com/",
  "SignedOutCallbackPath": "/signout-callback-oidc",
  "TenantId": "[Tenant Id]"
}