我在让 SSO 工作时遇到了一个问题,这很令人困惑。下面配置中的 CallBackPath 与 Azure 中的重定向 uri 相匹配,我可以在日志中看到用户已成功通过身份验证。然后发生的事情是,他们在开发工具中的网络选项卡中收到 302,然后在页面上变成 502。
我不确定我是否遗漏了什么,或者配置有误。有人能提供建议吗?
我的配置:
"Authentication": {
"ClientId": "xxxxxx",
"ClientSecret": "yyyyyyyy",
"Authority": "https://login.microsoftonline.com/zzzzzzz",
"CallbackPath": "/mypath/mypage",
"Scope": "openid profile email"
},
我想要启动 SSO 的登录页面的路由:
[AllowAnonymous]
[Route("login")]
public IActionResult Login()
{
return Challenge(new AuthenticationProperties(), OpenIdConnectDefaults.AuthenticationScheme);
}
以及 program.cs 中的相关部分
.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("OpenIdConnect", options =>
{
options.ClientId = builder.Configuration["Authentication:ClientId"];
options.ClientSecret = builder.Configuration["Authentication:ClientSecret"];
options.Authority = builder.Configuration["Authentication:Authority"];
options.CallbackPath = builder.Configuration["Authentication:CallbackPath"];
options.ResponseType = "code";
options.SkipUnrecognizedRequests = true;
options.SaveTokens = true;
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = async context =>
{
// Log successful authentication
var userId = context.Principal?.Claims.FirstOrDefault(c => c.Type == "name")?.Value
?? context.Principal?.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value
?? "Unknown User";
Log.Information("SSO Log - User {UserId} successfully authenticated via SSO.", userId);
await Task.CompletedTask;
},
OnAuthenticationFailed = context =>
{
Log.Error("SSO Log - Authentication failed: {Error}", context.Exception.Message);
return Task.CompletedTask;
}
};
});
我在一个新的 .net 8 MVC 应用程序中测试了 OP 的代码,除了控制器中的登录方法外,该应用程序运行良好。我在控制器类上添加了 [Authorize] 属性,这样当我运行该应用程序时,它会重定向到 Microsoft 登录页面,并在成功登录后重定向回我的主页索引页。但是一旦我手动点击登录方法,我就会陷入无限重定向循环,然后出现有关登录的错误。
我推断该问题可能与重定向有关,因此我对登录方法进行了更改
return Challenge(new AuthenticationProperties { RedirectUri = Url.Content("~/accounts/home") }, OpenIdConnectDefaults.AuthenticationScheme);
,添加了重定向 URL。在我的测试中,登录成功后会将流程重定向到appsetting.json中定义的回调路径,在我这边我将其设置为
/home
,然后重定向到return Challenge中定义的url。