我正在使用 .NET 6 Razor 页面应用程序(不是 MVC),我需要在其中实现 SSO 身份验证 (Okta)。
为此,我在 Razor 页面应用程序中创建了一个 MVC 控制器(我知道这是奇怪的方法),并在 program.cs 中启用路由,如下所示:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // Map attribute-routed API controllers
endpoints.MapDefaultControllerRoute(); // Map conventional MVC controllers using the default route
endpoints.MapRazorPages();//map razor pages
});
现在我有一个名为
Privacy
的页面,我用 Authorize 属性进行了装饰,在此页面中,如果用户未经过身份验证,我将重定向以进行 Okta 身份验证。
[Authorize]
public void OnGet()
{
string UserName = User.Identity.Name;
if (string.IsNullOrEmpty(UserName))
Response.Redirect("/Account/Login");
}
现在 Okta 身份验证工作正常,我收到 Okta 登录屏幕,登录页面,它被重定向回我的控制器,所有必需的声明均已正确设置。 (我可以在我设置的 HttpContext.User 对象的快速监视中验证它)。
public async Task<ActionResult> Login()
{
var oktaResult = await HttpContext.AuthenticateAsync(OpenIdConnectDefaults.AuthenticationScheme);
if (oktaResult.Succeeded)
{
HttpContext.User = new ClaimsPrincipal(oktaResult.Principal.Identity);
return RedirectToPage("/Privacy"); // <--- Here is the problem
}
return Challenge(OpenIdConnectDefaults.AuthenticationScheme);
}
问题是,重定向回
/Privacy
页面后,HttpContext.User
对象再次变为空白。
我不明白为什么。我在这里做错了什么?
确保您的 Cookie 政策设置正确。
app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.None });
按如下顺序调用中间件:UseRouting、UseAuthentication、UseAuthorization、UseEndpoints。
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // Map attribute-routed API controllers
endpoints.MapDefaultControllerRoute(); // Map conventional MVC controllers using the default route
endpoints.MapRazorPages();//map razor pages
});
您可以阅读配置身份服务了解更多信息。