#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, и он работает так, как должен. Мне пришлось изложить претензии немного по-другому.