#c# #asp.net #openid-connect
Вопрос:
Мы пытаемся разработать сетевое приложение ASP, и нам приходится использовать систему аутентификации oidc.
у нас есть свой собственный сервер OIDC. Когда мы пытаемся подключиться, мы получаем сообщение об ошибке :
«Система.Исключение: При обработке удаленного входа в систему произошла ошибка. —gt; Microsoft.Идентификационная модель.Протоколы.OpenIdConnect.Исключение OpenIdConnectProtocolException: Сообщение содержит ошибку: «недопустимый клиент», описание ошибки: «Недопустимый метод аутентификации для доступа к этой конечной точке»., error_uri: «Значение error_uri равно нулю».»
вот наша функция ConfigureService и функция настройки:
public void ConfigureServices(IServiceCollection services) { IdentityModelEventSource.ShowPII = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; services.AddMvc(); services.AddOptions(); SetGlobalConfig(); services.AddHttpContextAccessor(); services.AddResponseCompression(options =gt; { options.Providers.Addlt;BrotliCompressionProvidergt;(); options.Providers.Addlt;GzipCompressionProvidergt;(); options.EnableForHttps = true; }); services.AddAntiforgery(options =gt; { options.Cookie.Name = "X-CSRF-TOKEN-OurAppli"; options.HeaderName = "X-CSRF-TOKEN-OurAppli"; options.FormFieldName = "X-CSRF-TOKEN-OurAppli"; }); services.AddSession(options =gt; { options.IdleTimeout = TimeSpan.FromMinutes(5); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always; }); services.AddDetection(); services.AddControllersWithViews(); var identityUrl = Configuration.GetValuelt;stringgt;("IdentityUrl"); var bearerUrl = Configuration.GetValuelt;stringgt;("BearerUrl"); var callBackUrl = Configuration.GetValuelt;stringgt;("CallBackUrl"); var sessionCookieLifetime = Configuration.GetValue("SessionCookieLifetimeMinutes", 60); services.TryAddSingletonlt;IHttpContextAccessor, HttpContextAccessorgt;(); services.AddAuthentication(options =gt; { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie(setup =gt; setup.ExpireTimeSpan = TimeSpan.FromMinutes(sessionCookieLifetime)) .AddOpenIdConnect(options =gt; { options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.ResponseType = "code"; options.ClientId = "*******"; options.ClientSecret = "********"; options.Authority = "https://ourOIDCServer/ourOIDCServerwebsso/oauth2/multiauth"; options.GetClaimsFromUserInfoEndpoint = true; options.Scope.Clear(); options.Scope.Add("openid uid isMemberOf"); options.SaveTokens = true; options.Configuration = new OpenIdConnectConfiguration { AuthorizationEndpoint = "https://ourOIDCServer/ourOIDCServerwebsso/oauth2/multiauth/authorize", TokenEndpoint = "https://ourOIDCServer/ourOIDCServerwebsso/oauth2/multiauth/access_token", UserInfoEndpoint = "https://ourOIDCServer/ourOIDCServerwebsso/oauth2/multiauth/userinfo", EndSessionEndpoint = "https://ourOIDCServer/ourOIDCServerwebsso/oauth2/multiauth/connect/endSession", RegistrationEndpoint = "https://ourOIDCServer/ourOIDCServer/oauth2/multiauth/connect/register", JwksUri = "ourOIDCServer/ourOIDCServer/oauth2/multiauth/connect/jwk_uri", }; options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context =gt; { context.ProtocolMessage.SetParameter("acr_values","ourACR"); context.ProtocolMessage.SetParameter("authlevel", "3"); var byteArray = Encoding.ASCII.GetBytes(options.ClientId ":" options.ClientSecret); context.Request.Headers.Add("Authorization", "Post " byteArray); return Task.FromResult(0); } }; }); services.AddHsts(options =gt; { options.Preload = true; options.IncludeSubDomains = true; options.MaxAge = TimeSpan.FromDays(365); }); } public void Configure(IApplicationBuilder app, IHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/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.UseResponseCompression(); app.UseDetection(); app.UseSession(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.Use(async (context, next) =gt; { context.Response.Headers.Add("X-Frame-Options", "DENY"); context.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; font-src 'self';script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'"); await next(); }); app.UseEndpoints(endpoints =gt; { endpoints.MapControllerRoute( name: "Index", pattern: "{controller=Home}/{action=Index}"); }); app.UseStaticFiles(); }`
А вот и наш домашний контролер :
[Authorize] public ActionResult Index() { Console.WriteLine(_user); Console.WriteLine(_habilitation); dynamic models = new ExpandoObject(); models.detection = _detectionService; if (!string.IsNullOrEmpty(_user) || _user != "") { models.Authorization = _habilitation; models.Name = _user; Console.WriteLine(models.Name " Auth= " models.Authorization); models.Habilitation = 1; } return View("Index", models); }
Я никогда не использовал систему аутентификации OIDC с ASP Net, поэтому я не знаю, есть ли что-то не так с моим кодом…
Надеюсь, кто-нибудь сможет мне помочь!
Ответ №1:
Можете ли вы добавить к вопросу, как определяется клиент? Каким поставщиком OIDC вы пользуетесь?
Проблема, похоже, в том, что клиент запрашивает здесь «поток кода авторизации».:
options.ResponseType = "code";
но у поставщика OIDC это не включено. Я бы сначала проверил это.