Ошибка аутентификации при подключении с открытым идентификатором Blazor «Запрос включал несколько учетных данных клиента»

#asp.net #authentication #blazor #openid-connect #isam

Вопрос:

Я реализовал соединение Open ID с 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 =gt;  {  e.MaximumReceiveMessageSize = 102400000;  });  services.AddBlazoredModal();  services.AddHttpClient();  services.AddScopedlt;AccessTokenStoragegt;();  services.AddAuthentication(opt =gt;  {  opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;  opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;  opt.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;  }).AddCookie().AddOpenIdConnect("oidc", options =gt;  {  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 =gt;  {  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 =gt;  {  endpoints.MapBlazorHub();  endpoints.MapFallbackToPage("/_Host");  });  } }  

Еще одна жизненно важная часть:

Логин.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 могут содержать только одну учетную запись клиента. Например, запрос не может содержать учетные данные клиента как в заголовке запроса, так и в теле запроса.

Является ли это проблемой со стороны Blazor или проблемой с поставщиком удостоверений личности?

Это происходит, казалось бы, случайным образом, но это всегда происходит при удалении файлов cookie aspnetcore в браузере. Выполнение этого должно просто вернуть вас на экран входа в систему, но вместо этого выдает эту ошибку. (Не происходит с demo.identiserver.io…)

Комментарии:

1. можете ли вы опубликовать образец HTTP-запроса с заголовками и URL-адресом, который вызывает проблему? Используйте Fiddler, чтобы получить подробную информацию о запросе.

Ответ №1:

Решил эту проблему. Кажется, это проблемная линия:

 options.GetClaimsFromUserInfoEndpoint = true;  

Я удалил его/установил значение false, и он работает так, как должен. Мне пришлось изложить претензии немного по-другому.