I have implemented it previously and it is working fine. Please find below sample code:
public class KeycloakIdentityProvider : IdentityProvidersProcessor
{
protected override string IdentityProviderName => "keycloak";
private string ClientId => Settings.GetSetting(KeycloakSettings.ClientId, "");
private string ClientSecret => Settings.GetSetting(KeycloakSettings.ClientSecret, "");
private string Authority => Settings.GetSetting(KeycloakSettings.Authority, "");
private string MetadataAddress => Settings.GetSetting(KeycloakSettings.MetadataAddress, "");
private string RedirectURL => Settings.GetSetting(KeycloakSettings.RedirectURL, "");
private readonly string OpenIdScope = OpenIdConnectScope.OpenIdProfile + " email";
private readonly string idToken = "id_token";
private readonly string accessDeniedRelativePath = "/custom/errorpages/Forbidden.aspx";
public KeycloakIdentityProvider(FederatedAuthenticationConfiguration federatedAuthenticationConfiguration, Microsoft.Owin.Infrastructure.ICookieManager cookieManager, BaseSettings settings) : base(federatedAuthenticationConfiguration, cookieManager, settings)
{
}
protected IdentityProvider IdentityProvider { get; set; }
protected override void ProcessCore(IdentityProvidersArgs args)
{
IdentityProvider = this.GetIdentityProvider();
var httphandler = new HttpClientHandler();
httphandler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
httphandler.CheckCertificateRevocationList = true;
httphandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
{
return true;
};
var options = new OpenIdConnectAuthenticationOptions
{
BackchannelHttpHandler = httphandler,
//Backchannel = httpclient,
RequireHttpsMetadata = false,
MetadataAddress = MetadataAddress,
ClientId = ClientId,
ClientSecret = ClientSecret,
Authority = Authority,
RedirectUri = RedirectURL,
ResponseType = OpenIdConnectResponseType.Code,
Scope = OpenIdScope,
AuthenticationType = IdentityProvider.Name,
RedeemCode = true,
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = notification =>
{
if (notification.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
{
if (Sitecore.Context.User.IsAuthenticated)
{
notification.HandleResponse();
notification.Response.Redirect(Settings.GetSetting("Identity.sso.launchpad"));
}
else
{
notification.ProtocolMessage.SetParameter("kc_idp_hint", "saml");
}
}
if (notification.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
{
// If signing out, add the id_token_hint
var idTokenClaim = notification.OwinContext.Authentication.User.FindFirst(idToken);
if (idTokenClaim != null)
notification.ProtocolMessage.IdTokenHint = idTokenClaim.Value;
}
return System.Threading.Tasks.Task.CompletedTask;
}
}
};
args.App.UseKentorOwinCookieSaver();
args.App.UseOpenIdConnectAuthentication(options);
}
}
In the 'RedirectUri' you can set call back URL, so it will redirect back to that URL.
Full blog you can check here https://swatiguptablogs.blogspot.com/2023/06/keycloak-integration-with-sitecore-part.html