- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的项目正在使用 WIF (但这对于这个问题的上下文来说并不重要。您可以使用处理身份验证的替代框架。问题是关于在执行 ajax 请求时处理身份验证失败的问题) 。不过,就我而言,我编写了继承自 ClaimsAuthenticationManager
的自定义服务器逻辑,并处理身份验证:
public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
{
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated)
{
// add some custom claims
}
return incomingPrincipal;
}
现在,在我删除所有 session 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);
}
如何解决这个难题?
最佳答案
我找到了一些与此相关的资源(请参阅答案的底部),并与以下解决方案混合在一起:
在执行ajax请求时,我指定要返回json:
$.ajax({
url: action,
type: 'POST',
dataType: 'json',
data: jsonString,
contentType: 'application/json; charset=utf-8',
success:
function (result, textStatus, xhr) {
}
});
因为我的框架处理身份验证,当 token 过期时,它会将 http 状态 302 放入响应中。因为我不希望浏览器透明地处理 302 响应,所以我在 Global.asax 中捕获它,并将状态更改为 200 OK。此外,我添加了 header ,它指示我以特殊方式处理此类响应:
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302
&& (new HttpContextWrapper(Context)).Request.IsAjaxRequest())
{
Context.Response.StatusCode = 200;
Context.Response.AddHeader("REQUIRES_AUTH", "1");
}
}
响应内容未正确序列化为json,导致解析错误。调用错误事件,在其中执行重定向:
$(document).ready(function () {
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (XMLHttpRequest.getResponseHeader('REQUIRES_AUTH') === '1') {
// redirect to logon page
window.location = XMLHttpRequest.getResponseHeader('location');
}
// do sth else
}
});
});
参见How to manage a redirect request after a jQuery Ajax call在这里 How do you deal with AJAX requests when user session expires, or where the request terminates in a 302以获得更多解释。
更新:
同时,我想出了新的解决方案,在我看来更好,因为可以应用于所有开箱即用的ajax请求(如果它们没有明显地重新定义beforeSend事件):
$.ajaxSetup({
beforeSend: checkPulse,
error: function (XMLHttpRequest, textStatus, errorThrown) {
document.open();
document.write(XMLHttpRequest.responseText);
document.close();
}
});
function checkPulse(XMLHttpRequest) {
var location = window.location.href;
$.ajax({
url: "/Controller/CheckPulse",
type: 'GET',
async: false,
beforeSend: null,
success:
function (result, textStatus, xhr) {
if (xhr.getResponseHeader('REQUIRES_AUTH') === '1') {
XMLHttpRequest.abort(); // terminate further ajax execution
window.location = location;
}
}
});
}
Controller 方法可以是任何最简单的方法:
[Authorize]
public virtual void CheckPulse() {}
Application_EndRequest()
与以前一样。
关于asp.net-mvc - 使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的 session Cookie 过期处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11049690/
我试图了解 WIF 中主动和被动联合之间的区别。如果依赖方 (RP) 是 WCF 服务而不是 ASP.NET 应用程序,则似乎使用主动联合;如果 RP 是 ASP.NET 应用程序,则使用被动联合。这
新的路由服务如何处理安全性?根据http://blogs.microsoft.co.il/blogs/applisec/archive/2011/12/12/wcf-routing-and-messa
SessionAuthenticationModule 类中的事件之一是 SessionSecurityTokenReceived。这使我们能够查看从 AD FS 收到的 session token
SessionAuthenticationModule 类中的事件之一是 SessionSecurityTokenReceived。这使我们能够查看从 AD FS 收到的 session token
我需要安装 IdentityTrainingKitApril2020.VS2010,它让我安装 WindowsIdentityFoundation-SDK-4.0。 但设置 WIF SDK 失败并显示
我正在尝试为将使用 WIF 进行身份验证的 ASP.NET MVC3 应用程序开发身份验证插件。由于它是具有系统内配置的插件,因此我避免接触应用程序的 web.config 文件或其他任何内容。我已经
据我所知,在 WIF 1.0 中,Windows Identity 直接源自 IIdentity。在 WIF 4.5 中,Windows Identity 派生自实现 IIdentity 的 Clai
我很想知道我们如何可能从一个 WIF 应用程序发送一个安全 token ,该应用程序已经通过 WIF 启用的 WCF 服务的身份验证。 任何帮助都将得到认可 最佳答案 答案并不简单,但以下步骤构成了“
我已使用最新 WIF SDK(适用于 .NET 4.0)附带的被动和主动案例的项目模板成功创建了一个有效的自定义 STS。一切都按预期进行。 我现在正在尝试将我的 Web 应用程序和服务升级到 .NE
我正在考虑使用 Azure 访问控制来实现 SSO。但一些 Web 应用程序使用 .net 3.5。基于 Azure ACS 的 STS 是否支持 WIF 3.5 依赖方? 最佳答案 是的。这不是 A
我很难理解应该如何定义 claim 。网络上有很多关于创建声明的信息,但似乎没有一个是一致的。我在不同的帖子中发现了声明的四个属性: claim 类型 claim 值(value) 值类型 右 假设您
我一直在阅读有关 Windows Identity Foundation 的一些文章,并且对联邦提供程序有一些模糊的定义(可能是我的理解不准确)。但是,我没有看到一篇文章清楚地在身份提供者和联合提供者
我有一个 Web 应用程序,希望使用使用 Windows Identity Foundation 3.5 的自定义 STS 来保护它。所有示例在场景中都有一个被动 STS。为什么需要这个?如果您直接调
我正在尝试将声明感知 WCF 服务和客户端放在一起。 我正在使用 thinktecture Identity Server ,并且我通过查看“将 token 与 WCF/SOAP 一起使用”示例组装了
全部, 我一直在阅读很多有关基于声明的身份验证的内容,但仍然有些困惑。我试图巩固我的理解,特别是与SharePoint 2010/2013有关,但也与一般情况(即ASP.NET)有关。 我对各种技术术
我们有一个使用 WIF 的 ASP.NET 应用程序。我们的 web.config 文件有一个像这样的部分: 我看到的每个示例中,audienceUris 和 r
我们有一个现有的 ASP.NET 应用程序 (WebForms),它使用自行开发的身份验证。我们的任务是实现单点登录解决方案,并选择使用 WIF。 我们有一个正在运行的应用程序实例,我们通过使用子域(
在彻底搜索了 SO 的答案之后,这次我必须永远问我的第一个问题! 开始 : 我有一个 Windows 窗体应用程序,它使用十几个 WCF 服务来处理所有业务逻辑。 WIF 在每个 WCF 服务上实现,
我有一个站点是我们基于 WIF 的自定义 STS 的依赖方。我们最近实现了一个安全 token 缓存,如下所述:Azure/web-farm ready SecurityTokenCache .我们的
我们有一些应用程序可以使用表单例份验证通过传统的用户名/密码或电子邮件/密码方法进行身份验证。我们希望慢慢地将这些帐户迁移到 Windows Identity Foundation (WIF)。 将表
我是一名优秀的程序员,十分优秀!