Неверный метод аутентификации, неверная ошибка клиента при попытке подключиться к OIDC

#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 это не включено. Я бы сначала проверил это.