gpt4 book ai didi

ajax - ADFS session 过期并导致错误

转载 作者:行者123 更新时间:2023-12-04 12:33:31 28 4
gpt4 key购买 nike

我们将 ADFS 用于我们的内部应用程序 - 用户基本上可以在任何时候访问我们的应用程序之一时透明地登录。但是,如果用户将页面打开超过一个小时,然后尝试在该页面上执行某些操作(而不是导航到另一个页面),则会收到错误消息:

This page is accessing information that is not under its control. This poses a security risk. Do you want to continue?



该页面似乎正在尝试将该请求重定向到 ADFS 服务器,但浏览器已阻止该请求。

我的问题是:如何捕捉这种情况并让用户到 ADFS 服务器重新进行身份验证?

我没有运气在谷歌上找到任何关于这个的东西。

最佳答案

更新:以下解决方案取决于 iframe。 ADFS 3.0 的 X-Frame-Options 默认为 DENY,没有更改设置的选项。因此,此解决方案仅适用于 ADFS 2.1 及更早版本。

在您的 global.asax.cs 中,您将想要捕获任何中间 AJAX 302 并将它们转换为 401 Unauthorized。这将阻止调用继续(并弹出该消息),并将我们发送到 $(document).ajaxError()。

    protected void Application_EndRequest()
{
var context = new HttpContextWrapper(this.Context);
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
{
context.Response.Clear();
context.Response.StatusCode = 401;
}
}

然后,在那里拦截任何 401,然后再进行其余的错误处理。我选择向用户显示一条消息。您可以在此处执行下一步,但为了可读性,我将 ajaxSettings 对象发送到另一个函数。返回 true 以便它不会继续进行其余的错误处理。

如果您想仔细检查这是 ADFS,则 event.target.referrer 将包含尝试重定向的 URL。
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
if (xhr.status == 401) {
alert("Your session has timed out. Click OK to reauthorize and extend your session.");

TriggerReauthenticationRefresher(ajaxSettings);
return true;
}
…the rest of the error handling code…
});

我的页面中有一个空 div 用于这种情况,id 为“refresherBox”,但您可以在 DOM 中的任何元素上执行此操作。将 iframe 放在一起,转到您域中的某个虚拟页面。就我而言,ADFSRefresher.cshtml 的内容只是
 <div><input type="hidden" value="@DateTime.Now.ToString()" /></div>

我没有使用全局变量,而是使用 .data() 存储 ajaxSettings。我们还需要跟踪 iframe 重新加载的次数,因此我们还要存储加载计数。将 iframe 插入到 DOM 中,它就会启动。
function TriggerReauthenticationRefresher(ajaxSettings) {
var refreshframe = '<iframe src="@Url.Action("ADFSRefresher", "Debug")" style="display:none" onload="TrackFrameReloads()" />';

$('#refresherBox').data('loadcount', 0);
$('#refresherBox').data('originalRequestSettings', ajaxSettings);

$('#refresherBox').html(refreshframe);
}

每次 iframe 完成加载时都会触发 TrackFrameReloads。因为我们知道有一个即将发生的 ADFS 重定向,它会触发两次。第一次是重定向,第二次是重定向到它的 src url。所以第一次触发时,我们只是增加 loadcount。

第二次触发时,我们知道我们已成功重新进行身份验证。检索ajaxSettings,清除存储的数据,然后您可以重新使用您的原始设置发送AJAX调用!它将通过,未重定向并运行其原始成功和完整功能。
function TrackFrameReloads() {
var i = $('#refresherBox').data('loadcount');
if (i == 1) {
alert('Your session has been extended.');

var ajaxSettings = $('#refresherBox').data('originalRequestSettings');

$('#refresherBox').removeData();

$.ajax(ajaxSettings);

} else {
$('#refresherBox').data("loadcount", 1);
}
}

请注意,如果您定义了它们,则错误和完整功能将已经被触发。

如果您愿意,您可以跳过给用户的两条警报消息。根据您的 ADFS 设置,这应该只需要 1 秒,并且用户根本不需要被告知任何这些都发生了!

关于ajax - ADFS session 过期并导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15668751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com