【发布时间】:2012-06-18 11:10:27
【问题描述】:
我的项目我正在使用 WIF (但这对于这个问题的上下文并不重要。您可以使用替代框架来处理您的身份验证。问题是关于在执行 ajax 请求时处理身份验证失败) 。不过,就我而言,我编写了继承自 ClaimsAuthenticationManager 并处理身份验证的自定义服务器逻辑:
public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
{
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated)
{
// add some custom claims
}
return incomingPrincipal;
}
现在,在我删除所有会话 Cookie 后,结束然后再次进入任何页面,我被重定向到 WIF 提供的登录页面,并要求我再次登录。一切正常。
但如果我改为发出 ajax 请求,则会出现错误,并被以下代码拦截:
$(document).ready(function () {
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
// do something
}
});
});
不幸的是,XMLHttpRequest 对象没有返回任何有意义的消息,基于此,我可以像其他人一样以任何其他方式处理这种错误。在这种特殊情况下,我只希望应用程序重定向到登录页面 - 就像正常请求一样。
在执行 ajax 调用时,将调用来自 ClaimsAuthenticationManager 的方法 Authenticate。 Identity.IsAuthenticated 返回 false,方法结束,一切都完成了。甚至 BaseController 中的 OnAuthorization 方法也没有被调用,所以我无法将任何状态传递给 ajax 结果对象。
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && !User.Identity.IsAuthenticated)
{
//do something, for example pass custom result to filterContext
}
base.OnAuthorization(filterContext);
}
如何解决这个难题?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 jquery session-cookies wif