我目前正在尝试将基于Owin Cookies的身份验证SSO集成到现有的Webforms项目中。这是一个Web应用程序,需要用户始终登录,因此尝试加载任何页面的用户应自动发送到外部SSO登录屏幕。
我目前处理此问题的方式是将PreLoad事件注入到母版页中,因为尝试在OnInit中运行它会引发异常,并且它需要在Page_Load之前发生。
protected void OnPreLoad(object sender, System.EventArgs e)
{
if (!Request.IsAuthenticated)
{
string redirectUri = Request.Url.PathAndQuery;
HttpContext.Current.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = redirectUri },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
身份验证可以正常工作,但有一个特定的缺陷:在执行重定向之前,它完成了对请求页面的加载,包括所有代码执行。
因此,任何依赖于有关用户的信息的代码都会引发异常,因为该用户不存在...并导致该代码在可以执行挑战重定向之前崩溃。我可以通过加载不引用用户信息的页面来确认它是否可以正常工作。
这以前不是问题,因为该项目曾经使用Forms Auth,这会中断代码执行以重定向您,而不是让它继续。
这里的“硬”解决方案是遍历我的代码,进入每个页面,然后添加如果请求未通过身份验证则停止执行的代码,加载立即重定向的无效页面,但这将花费大量时间。大量的精力投入。
所以,我的问题是这个。有没有一种方法可以触发Owin执行立即中断工作流的重定向,这样我就可以在登录过程中跳出来,而无需尝试执行页面上的所有代码?