Авторизация через Keycloak (проверка авторизации)

Всем привет. Добавляю в проект авторизацию через Keycloak. Но на проекте уже есть авторизация по IP. Нужно сохранить эту авторизацию, а KC использовать для тех чей IP не числится в БД (доступ к отдельным сервисам) Столкнулся с проблемой. После переадресации на KC и успешной авторизации в нем, а не знаю как на стороне кслиента ASP NET MVC проект. Проверить факт авторизации в КС. Мне эта информация нужна для предоставления доступа. Хочу просто подсуннуть переменную, которая будет говорить что пользователь авторизован в КС в проверку которая работает для доступа по IP, чтобы не перепиливать весь код авторизации.

КС подключен вот так:

 services
 .AddAuthentication(options =>
 {
     options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
 })
 .AddCookie(cookie =>
 {
     cookie.Cookie.HttpOnly = true;
     cookie.Cookie.SecurePolicy = CookieSecurePolicy.None;
     cookie.Cookie.SameSite = SameSiteMode.Strict;
     cookie.SlidingExpiration = true;
     cookie.Cookie.Name = "SessionId";
     cookie.Cookie.MaxAge = TimeSpan.FromMinutes(60);
     //cookie.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
     cookie.SlidingExpiration = true;
 })
  .AddOpenIdConnect(options =>
  {
      options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
      options.Authority = "http://10.10.104.220:88/auth/realms/IPN";
      options.ClientId = "ipcp";
      options.ClientSecret = "qXZx49SakXnnEWs06Db5On4eXXHVG8M7";

      //options.MetadataAddress = Configuration.GetSection("Keycloak")["Metadata"];  
      //Require keycloak to use SSL  
      options.RequireHttpsMetadata = false;
      options.GetClaimsFromUserInfoEndpoint = true;
      options.Scope.Add("openid");
      options.Scope.Add("profile");
      options.Scope.Add("email");

      options.SaveTokens = true;
      options.ResponseType = OpenIdConnectResponseType.Code;
      options.NonceCookie.SameSite = SameSiteMode.None;
      options.CorrelationCookie.SameSite = SameSiteMode.None;
      options.SignedOutRedirectUri = "http://185.34.152.60:11059/Agents";
      options.TokenValidationParameters = new TokenValidationParameters
      {
          NameClaimType = "name",
          RoleClaimType = "https://schemas.scopic.com/roles"
      };
      options.Events.OnRedirectToIdentityProvider = async context =>
      {
          context.ProtocolMessage.RedirectUri = "http://185.34.152.60:11059/Agents";
          await Task.CompletedTask;
      };

Авторизация на контроллер и классы навешивается через атрибут, метод валидации которого предоставлен ниже.

 public static bool IsUserAllowed(HttpContext httpContext, AccessUserAclObjectType? objectType, AccessUserAclAction? action)
 {
         bool isAuthKeycloak = httpContext.User.HasClaim("keycloakAuthorizationClaim", "Authorized");
     if (string.IsNullOrEmpty(httpContext.User.Identity.Name) && httpContext.User.Identity != null) 
     {
         // Получение предыдущего URL запроса
         var returnUrl = httpContext.Request.Headers["Referer"].ToString(); 
         if (string.IsNullOrEmpty(returnUrl))
         {
             returnUrl = "/";
         }
         // Перенаправление на метод контроллера KeycloakAuthorization для инициации авторизации через Keycloak
         httpContext.Response.Redirect($"{returnUrl}KeycloakAuthorization/KeycloakAuthorization");
         return true;
     }
     else
     {
         var roles = httpContext.User.Claims.Where(c => c.Type == ClaimTypes.Role).Select(r => (AccessUserAclObjectType)Enum.Parse(typeof(AccessUserAclObjectType), r.Value)).ToArray();
         var allowedActions = httpContext.User.Claims.Where(c => c.Type == "AllowedAction").Select(r => (AccessUserAclAction)Enum.Parse(typeof(AccessUserAclAction), r.Value)).ToArray();
         var aa = (!objectType.HasValue && !action.HasValue) || (roles.Any(r => r == objectType) && allowedActions.Any(a => a >= action));
         return (!objectType.HasValue && !action.HasValue) || (roles.Any(r => r == objectType) && allowedActions.Any(a => a >= action));
     }
 }

В isAuthKeycloak по идее должен получать информацию о том что авторизовался в КС. Но в HttpContext.User.Claim у меня ничего нет.

Подскажите, пожалуйста, что нужно донастроиь или изменить?


Ответы (0 шт):