Авторизация через 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 у меня ничего нет.
Подскажите, пожалуйста, что нужно донастроиь или изменить?