OpenIddict 4 WebProviders未配置外部认证方案,登录页不显示提供商
解决OpenIddict 4.0.0 WebIntegration外部登录提供商不显示在Identity UI的问题
要让通过OpenIddict.Client.WebIntegration注册的外部登录提供商在Identity默认登录页显示,需要完成以下关键配置:
为外部登录方案设置显示名称与Identity关联
注册WebProvider时,必须显式设置DisplayName(供UI显示)和SignInScheme(关联到Identity的外部登录流程),示例代码:services.AddOpenIddict() .AddClient(options => { options.UseWebProviders() .UseGitHub(github => { github.SetClientId("你的GitHub客户端ID"); github.SetClientSecret("你的GitHub客户端密钥"); github.DisplayName = "GitHub"; // 必须设置,否则UI无法识别显示 github.SetSignInScheme(IdentityConstants.ExternalScheme); // 关联到Identity外部登录流程 }); });Identity的
SignInManager.GetExternalAuthenticationSchemesAsync()只会筛选标记为外部登录的方案,SetSignInScheme(IdentityConstants.ExternalScheme)就是给方案打上这个标记。确保中间件顺序正确
在Program.cs中,认证中间件的注册顺序必须符合要求:app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 先注册OpenIddict客户端中间件 app.UseOpenIddict(); // 再映射Identity的Razor Pages和控制器端点 app.MapRazorPages(); app.MapControllers();OpenIddict中间件需要在Identity端点之前注册,才能正确处理外部登录的回调流程。
验证登录页逻辑
确认Identity登录页的PageModel中正确调用了SignInManager.GetExternalAuthenticationSchemesAsync(),且视图正确渲染方案:// Login.cshtml.cs public async Task OnGetAsync(string returnUrl = null) { ReturnUrl = returnUrl; ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); }视图中循环渲染外部登录按钮:
<!-- Login.cshtml --> @foreach (var login in Model.ExternalLogins) { <button type="submit" asp-controller="Account" asp-action="ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" asp-route-provider="@login.Name"> 使用@login.DisplayName登录 </button> }
完成以上配置后,外部登录提供商就会自动出现在默认登录页的外部登录区域,无需手动创建链接。
内容的提问来源于stack exchange,提问作者Daniel Leiszen
相关产品推荐
相关产品推荐

