Blazor Open ID Connect 身份验证错误“请求包含多个客户端凭据”

Posted

技术标签:

【中文标题】Blazor Open ID Connect 身份验证错误“请求包含多个客户端凭据”【英文标题】:Blazor Open ID Connect authentication error "The request included multiple client credentials" 【发布时间】:2021-12-18 16:10:08 【问题描述】:

我使用以下方法实现了 Open ID Connect with Blazor:

Startup.cs

public class Startup

    public Startup(IConfiguration configuration)
    
        this.Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSignalR(e =>
        
            e.MaximumReceiveMessageSize = 102400000;
        );
        services.AddBlazoredModal();
        services.AddHttpClient();
        services.AddScoped<AccessTokenStorage>();
        services.AddAuthentication(opt =>
        
            opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            opt.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        ).AddCookie().AddOpenIdConnect("oidc", options =>
        
            options.Authority = Credentials.Authority;
            options.ClientId = Credentials.ClientId;
            options.ClientSecret = Credentials.ClientSecret;
            options.ResponseType = "code";
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
            options.UseTokenLifetime = false;
            options.Scope.Add("openid");
            options.Scope.Add("profile");
            options.TokenValidationParameters = new TokenValidationParameters  NameClaimType = "name" ;

            options.Events = new OpenIdConnectEvents
            
                OnAccessDenied = context =>
                
                    context.HandleResponse();
                    context.Response.Redirect("/");
                    return Task.CompletedTask;
                ,
            ;
        );
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseExceptionHandler("/Error");

            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
        );
    

另一个重要部分:

Login.cshtml.cs

public class LoginModel : PageModel

    public async Task OnGet(string redirectUri)
    
        await HttpContext.ChallengeAsync("oidc", new AuthenticationProperties  
        RedirectUri = redirectUri );
    

demo.identityserver.io 似乎可以正常工作。

但是,将其更改为我的公司身份提供者时,有时我会检索到以下错误:

FBTOAU228E 请求包括多个客户机凭证。 OAuth 2.0 协议请求只能有一个客户端凭据。例如, 请求不能在 BA 标头和 请求正文。

这是 Blazor 方面的问题还是身份提供者的问题?

它看似随机发生,但它总是在删除浏览器中的 aspnetcore cookie 时发生。这样做应该只会让您返回登录屏幕,但会引发此错误。 (不会发生在 demo.identiserver.io...)

【问题讨论】:

您能否发布一个带有导致问题的标头和 URL 的示例 HTTP 请求?使用 Fiddler 获取请求详情。 【参考方案1】:

解决了。似乎这是有问题的行:

options.GetClaimsFromUserInfoEndpoint = true;

我删除了它/将其设置为 false,它的工作方式应该如此。我不得不让声明有点不同。

【讨论】:

以上是关于Blazor Open ID Connect 身份验证错误“请求包含多个客户端凭据”的主要内容,如果未能解决你的问题,请参考以下文章

Open ID Connect 和本机公共应用程序......没有隐式流,没有混合流......那又如何?

是否可以使用 IDP 独立代码在 ReactJS 中实现 open id connect SSO?

使用 OpenID Connect 注销后强制登录并在 Blazor (.Net 6) 上设置寿命 cookie

Blazor IdentityServer 身份验证

使用身份在 Blazor 中检索用户名

如何通过 IdentityServer4 将 OpenId Connect 添加到 ASP.NET Core 服务器端 Blazor Web 应用程序?