実現したいこと
ASP.NET Core Web APIでKeycloakを用いたOpenID Connect認証を行えるようにしたい。
発生している問題・分からないこと
作成したASP.NET Core Web APIアプリケーションにおけるOpenID Connect認証でKeycloakにログインしたら431エラーになりました。
ログイン処理を開始したらKeycloakのIDとパスワードの入力画面までは表示されるのですが、IDとパスワードを入力を終えた後に431エラーの画面になります。
エラーメッセージ
error
1このページは動作していません 2この問題が何度も発生する場合は、サイト所有者にお問い合わせください。 3HTTP ERROR 431
該当のソースコード
Program.csのWebApplication.CreateBuilder(args)を呼び出している個所から下の部分
1var builder = WebApplication.CreateBuilder(args); 2 3#if DEBUG 4var MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; 5 6builder.Services.AddCors(options => 7{ 8 options.AddPolicy(name: MyAllowSpecificOrigins, 9 policy => 10 { 11 policy.WithOrigins("http://localhost:4200"); 12 }); 13}); 14#endif 15 16builder.Services.AddAuthentication(options => 17{ 18 options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 19 options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 20 options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 21}) 22 .AddCookie() 23 .AddOpenIdConnect(options => 24 { 25 options.Authority = builder.Configuration["oidc:authority"]; 26 options.ClientId = builder.Configuration["oidc:clientid"]; 27 options.ClientSecret = builder.Configuration["oidc:clientsecret"]; 28 options.ResponseType = "code"; 29 options.SaveTokens = true; 30 options.Scope.Add("openid"); 31 options.Scope.Add("profile"); 32 options.Scope.Add("email"); 33 options.CallbackPath = "/login-callback"; 34 options.SignedOutCallbackPath = "/logout-callback"; 35 });
Program.csのbuilder.Build()から下の部分
1var app = builder.Build(); 2 3#if DEBUG 4app.UseCors(MyAllowSpecificOrigins); 5#endif 6 7// Configure the HTTP request pipeline. 8 9app.UseHttpsRedirection(); 10 11app.UseAuthentication(); 12app.UseAuthorization(); 13 14// Add routes for callback handling 15app.Map("/login-callback", loginCallbackApp => 16{ 17 loginCallbackApp.Run(async context => 18 { 19 // Handle the callback from Keycloak after successful authentication 20 await context.Response.WriteAsync("Authentication successful"); 21 }); 22}); 23 24app.Map("/logout-callback", logoutCallbackApp => 25{ 26 logoutCallbackApp.Run(async context => 27 { 28 // Handle the callback from Keycloak after sign-out 29 await context.Response.WriteAsync("Sign-out successful"); 30 }); 31}); 32 33app.MapControllers(); 34 35app.Run(); 36
AccountController.csのログインに関する部分
1 2 [HttpGet("login")] 3 public IActionResult Login() 4 { 5 var redirectUrl = Url.Action(nameof(LoginCallback), "Auth"); 6 var properties = new AuthenticationProperties { RedirectUri = redirectUrl }; 7 return Challenge(properties, OpenIdConnectDefaults.AuthenticationScheme); 8 } 9 10 [HttpGet("login-callback")] 11 public async Task<IActionResult> LoginCallback() 12 { 13 var authenticateResult = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); 14 if (!authenticateResult.Succeeded) 15 { 16 return BadRequest(); // 認証失敗時の処理 17 } 18 19 // 認証成功時の処理 20 return Redirect(defaultReturnUrl); 21 } 22 23 [HttpGet("logout")] 24 public async Task<IActionResult> Logout() 25 { 26 await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); 27 await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme); 28 return Redirect(defaultReturnUrl); 29 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Copilotに質問しましたが改善できませんでした。
補足
特になし
あなたの回答
tips
プレビュー