在 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 文档中关于在此处添加外部身份验证提供程序的内容:
为了测试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]"
}
我通过 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 文档中关于在此处添加外部身份验证提供程序的内容:
为了测试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]"
}