- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在一个配置了 FormsAuthentication 的应用程序中,当用户在没有授权 cookie 或过时的 cookie 的情况下访问 protected 页面时,ASP.NET 发出 HTTP 401 Unauthorized,然后 FormsAuthentication 模块在请求结束之前拦截此响应,并且将其更改为 HTTP 302 Found,设置 HTTP header “Location:/path/loginurl”以便将用户代理重定向到登录页面,然后浏览器转到该页面并检索不 protected 登录页面,获取 HTTP 200 OK。
在没有考虑 AJAX 的情况下,这确实是一个非常好的主意。
现在我的应用程序中有一个返回 JSON 数据的 url,它需要对用户进行身份验证。一切正常,问题是如果 auth cookie 过期,当我的客户端代码调用服务器时,它将获得带有登录页面 html 的 HTTP 200 OK,而不是 HTTP 401 Unauthorized(因为前面已经解释过)。然后我的客户端试图将登录页面 html 解析为 json,但失败了。
接下来的问题是:如何处理来自客户端的过期身份验证?应对这种情况最优雅的解决方案是什么?我需要知道调用何时成功,我想使用 HTTP 语义来完成。
是否有可能以安全的跨浏览器方式从客户端读取自定义 HTTP header ?如果请求是 AJAX 请求,有没有办法告诉 FormsAuthenticationModule 不执行重定向?有没有一种方法可以像覆盖 HTTP 请求方法一样使用 HTTP header 来覆盖 HTTP 状态?
我需要表单例份验证,我想避免重写该模块或编写我自己的表单例份验证模块。
问候。
最佳答案
我有同样的问题,必须在 MVC 中使用自定义属性。您可以轻松地将其调整为在 Web 表单中工作,如果您的所有页面都继承自某个基页,您可以覆盖基页中的页面授权(MVC 中的全局属性允许相同的事情 - 为所有 Controller /操作覆盖 OnAuthorization 方法申请)
这是属性的样子:
public class AjaxAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest()
&& !filterContext.HttpContext.User.Identity.IsAuthenticated
&& (filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true).Count() > 0
|| filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true).Count() > 0))
{
filterContext.HttpContext.SkipAuthorization = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
filterContext.Result = new HttpUnauthorizedResult("Unauthorized");
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
filterContext.HttpContext.Response.End();
}
}
}
注意需要调用HttpContext.Response.End();否则您的请求将被重定向到登录(因此我失去了一些头发)。
在客户端,我使用了 jQuery ajaxError 方法:
var lastAjaxCall = { settings: null, jqXHR: null };
var loginUrl = "yourloginurl";
//...
//...
$(document).ready(function(){
$(document).ajaxError(function (event, jqxhr, settings) {
if (jqxhr.status == 401) {
if (loginUrl) {
$("body").prepend("<div class='loginoverlay'><div class='full'></div><div class='iframe'><iframe id='login' src='" + loginUrl + "'></iframe></div></div>");
$("div.loginoverlay").show();
lastAjaxCall.jqXHR = jqxhr;
lastAjaxCall.settings = settings;
}
}
}
}
这在当前页面上显示了 iframe 中的登录(看起来用户被重定向了,但你可以改变它),当登录成功时,这个弹出窗口被关闭,并且重新发送原始 ajax 请求:
if (lastAjaxCall.settings) {
$.ajax(lastAjaxCall.settings);
lastAjaxCall.settings = null;
}
这允许您的用户在 session 过期时登录,而不会丢失他们在上次显示的表单中输入的任何工作或数据。
关于asp.net - AJAX 和 FormsAuthentication,如何防止 FormsAuthentication 覆盖 HTTP 401?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532261/
我有一个应用程序,其中许多对象都扩展了一个抽象类,该抽象类定义了诸如 create() edit() retrieve() 和 delete()。由于每个子类对这些函数使用相同的逻辑,抽象类定义了默认
我正在使用$anchorScroll滚动到页面顶部,其中 html 元素具有 ID #brand。 AngularJS 代码: $location.hash(
我想停用我的应用程序中的右键单击,该右键单击提供了在桌面上安装应用程序的选项。我该如何做这样的事情? 最佳答案 右键单击 Visual Studio 中的项目并选择属性。那里有一个复选框“启用浏览器运
我使用 jquery 定位 div,在我的 CSS 中我有一个 div.right-sm:hover{background-color: blue} 我想使用 jquery 停止悬停: $(this
所以,我正在尝试复制 html5“占位符”属性功能。 我目前坚持的一件事是,在获得元素焦点时,插入符号立即出现在输入的开头。 就目前情况而言,插入符号出现在用户单击的位置,然后当我使用 jQuery
当表单填写并发送时,如果您刷新页面,它表示表单将再次发送。 (再次提交表格)。 防止这种情况发生的好方法是什么?或者终止这个 session ? 这方面有什么指导吗? 谢谢 最佳答案 处理完POST信
我想阻止 @ 被输入到 input 中。但它不起作用,知道为什么吗? $(function() { $(document).on('keyup', '[placeholder="x"]', fun
我正在使用 PHP 创建一个应用程序并涉及 MySQL。如果在请求过程中发生错误,我将如何“将查询分组在一起”,检查它是否会成功,然后对真实表进行实际影响。如果对表的实际更新失败,则恢复到更新之前的状
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Best Java obfuscator ? 对于我的示例,我知道 eclipse 提供了一个反编译插件。而
这是一个演示我的问题的 fiddle :JSFiddle 我正在制作自定义下拉菜单(实际上我使用的是 icomoon 图标而不是 V)...它看起来不错,但是父元素的 ::after 是阻止选择:(
每当我编写需要大量条件的代码时,我都会这样做: if foo: if bar: if foobar: if barfoo: if foobarfoo:
我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制文件/程序集以绕过检查: 例如在源代码中。 bool verificationResult = verify(); if (verif
我正在寻找一种简单的方法来检查多个零件表,以确定给定零件号在添加到给定表之前是否已经存在。 我目前想到的最好的想法是一个辅助表,它简单地将所有表中的每个 PN 列在一个列中,并带有一个唯一的键;但是我
这个问题在这里已经有了答案: jquery stop child triggering parent event (7 个答案) 关闭 8 年前。 我不确定这是否真的冒泡,我会解释。 我有这个:
我有一个 Spring MVC web 应用程序(不确定该信息是否重要,但它可能是)使用 ModelAndView 将字符串值传递给 JSP 文件。 字符串值的形式是: d@.
我在这里尝试使用表单 key 方法进行 csrf 保护 http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/
htmlentities 是防止 PHP 中的 XSS 的最佳解决方案吗?我还想允许像 b、i、a 和 img 这样的简单标签。实现这一点的最佳解决方案是什么?我确实考虑过 bbcode,但发现如果没
我有一个非常基本的 JAX-RS 服务(下面的 BookService 类),它允许创建 Book 类型的实体(也在下面)。 POST负载 { "acquisitionDate": 14188
我正在使用 Polymer 1.5,我确实需要“this”变量不要映射到外部。我知道 typescript 会为某些人做这件事 valid reasons . declare var Polymer:
这个问题在这里已经有了答案: Class-level read-only properties in Python (3 个答案) 关闭 6 年前。 有没有一种方法可以通过重写实例变量的 __set
我是一名优秀的程序员,十分优秀!