最近,我开始在现有的 Web 应用程序上使用基于声明的身份验证。因为应用程序使用了 jQuery 和更显着的 AJAX 函数,所以我不得不更改处理程序以不尝试重定向XmlHTTPRequests
,而是返回更容易处理的 403 状态。
这是FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed
事件处理程序:
protected void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e)
{
//WSFederationAuthenticationModule sam = (WSFederationAuthenticationModule)sender;
HttpContext context = HttpContext.Current;
HttpRequest req = context.Request;
HttpResponse resp = context.Response;
if (req == null || resp == null) return;
if ((resp.StatusCode == 302 || resp.StatusCode == 401) && req.Headers["X-Requested-With"] == "XMLHttpRequest")
{
resp.StatusCode = 403;
e.RedirectToIdentityProvider = false;
}
}
我有以下实现 AJAX 调用并处理响应的模式:
$.ajax({
cache: false,
data: $.param(o),
dataType: "xml",
url: "AJAXCall.ashx",
success: function (data)
{
// Success handler
},
error: function (XMLHttpRequest, textStatus, responseText)
{
if (XMLHttpRequest.status == 403)
{
var retVal = window.showModalDialog("Session.aspx", "", "dialogHeight: 250px; dialogWidth: 250px; edge: Raised; center: Yes; resizable: Yes; status: Yes;");
if (retVal)
{
// Succesful session renewal handler
}
else
{
// Session renewal failure handler
}
}
else
{
// Other errors handler
}
}
});
如果“Session.aspx”成功重定向到身份提供者并返回,则“Session.aspx”基本上会关闭返回值为 true 的模式对话框。
但我的问题是我收到以下错误:
“ID4223:SamlSecurityToken 被拒绝,因为不满足 SamlAssertion.NotOnOrAfter 条件。”
这是在模拟当前应用程序用户的子系统上调用的,显然前一个会话的令牌仍然存在。我的应用程序的 web.config 中有以下设置:
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" persistentCookiesOnPassiveRedirects="true" issuer="https://adfs.example.com/adfs/ls/" realm="https://www.example.com:449/" requireHttps="true" />
<cookieHandler requireSsl="true" />
如何避免此错误?任何帮助将不胜感激。