登录重定向无限循环

问题描述 投票:0回答:1
我正在致力于将 OpenID 身份验证集成到 .NET Core 应用程序中。 然而,在输入登录凭据后,我发现自己陷入了应用程序和身份验证服务器之间的连续重定向循环。最终,我收到一条错误消息,指出“我们无法让您登录。请重试。”

当前启动:

services.AddHttpContextAccessor(); services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme) .AddOpenIdConnect(options => { options.ClientId = ""; options.Authority = ""; options.Scope.Clear(); options.Scope.Add("openid"); options.Scope.Add("profile"); options.ResponseType = OpenIdConnectResponseType.IdToken; options.GetClaimsFromUserInfoEndpoint = true; options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.UseTokenLifetime = false; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true }; options.SaveTokens = true; options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = async (context) => { context.ProtocolMessage.RedirectUri = ""; context.ProtocolMessage.PostLogoutRedirectUri = ""; await Task.CompletedTask; }, OnTokenValidated = context => { return Task.CompletedTask; }, OnAuthorizationCodeReceived = (context) => { Console.WriteLine("Token Received: " + context.TokenEndpointResponse.IdToken); return Task.CompletedTask; }, OnAuthenticationFailed = OnAuthenticationFailed }; });
我已验证身份验证和授权是否按正确的顺序调用。

app.UseAuthentication(); app.UseAuthorization();
即使没有提到的中间件,当我仅依赖 

[Authorize]

 标签时,问题仍然存在。

app.Use(async (context, next) => { var user = context.User; if (user == null || user.Identity == null || !user.Identity.IsAuthenticated) { await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { IsPersistent = false, RedirectUri = "" }); return; } await next(); });
    
c# openid-connect .net-8.0
1个回答
0
投票
网站堆栈通常无法为您提供防止重定向循环的最佳控制。我更喜欢仅在刷新令牌过期时触发重定向。

问题的一个常见原因可能是使用

SameSite=none

 cookie,除非您通过 https 运行,否则它不会粘住。

以下 cookie 设置是最安全的,可能会解决您的问题。它们还允许您在开发人员工作站上使用 http URL。

services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.Cookie.SameSite = SameSiteMode.Strict; }) .AddOpenIdConnect(options => { options.NonceCookie.SameSite = SameSiteMode.Strict; options.CorrelationCookie.SameSite = SameSiteMode.Strict; options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; }
    
© www.soinside.com 2019 - 2024. All rights reserved.