Einrichtung: Wir haben eine ASP.NET-Anwendung, die auf der IIS-Instanz einer virtuellen Maschine gehostet wird. Bindungen sind einfach, ohne Hostnamen und verwenden http und Port 80.
Problem: Wenn Keycloak nicht erzwungen wird, kann die Webanwendung unter localhost oder http://VirtualMachineHostname aufgerufen werden. Wenn Keycloak jedoch nach der Authentifizierung (Anmeldebildschirm) erzwungen wird, tritt das System in eine Schleife von Aufrufen von http://VirtualMachineHostname/signin-oidc und ein http://KeycloakServer.net:29480/realms/ ... VirtualMac hineHostname%2Fsignin-oidc&response_type=code%20id_token%20token&scope=openid%20profile&response_mode=form_post&nonce=
Ich verstehe diesen Bereich nicht gut genug, um das Problem zu identifizieren. Es sieht so aus, als ob das Token abgerufen wird, aber bei der Weiterleitung kommt es zu einer Schleife. Mein „Bauchgefühl“ sagt mir, dass das Problem darin liegt, dass versucht wird, zurück zu „VirtualMachineHostname“ umzuleiten, aber stattdessen auf „localhost“ stößt, die Weiterleitungs-URL jedoch wie erwartet „VirtualMachineHostname“ anzeigt. Wir konfigurieren SignIn auch nicht explizit, sodass dies über die Keycloak-Benutzeroberfläche abgewickelt wird, im Gegensatz zu Logout, das über einen Controller und zugehörige Methoden verfügt, um Anmeldeinformationen zu löschen und nach der Abmeldung umzuleiten.
Keycloak-Einstellungen
- Gültige Post-Logout-Umleitungs-URIs = '+'
- Web Origins = '+'
- Gültige Redirect-URIs = "http://localhost/" & "http://VirtualMachineHostname/"
Code: Select all
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(opt =>
{
opt.ExpireTimeSpan = TimeSpan.FromMinutes(Convert.ToInt32(Configuration["Keycloak:cookie-timeout"]));
})
.AddOpenIdConnect(options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.Authority = $"{Configuration["Keycloak:auth-server-url"]}realms/{Configuration["Keycloak:realm"]}";
options.ClientId = Configuration["Keycloak:resource"];
options.ResponseType = OpenIdConnectResponseType.CodeIdTokenToken;
options.UsePkce = true;
options.Scope.Add("profile");
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters() { RoleClaimType = "roles" };
options.SignedOutCallbackPath = "/signout-callback-oidc";
});
var requireAuthPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
services.AddAuthorizationBuilder().SetFallbackPolicy(requireAuthPolicy);
Mobile version