asp.net – AJAX和FormsAuthentication,如何防止FormsAuthentication覆盖
|
在配置了FormsAuthentication的一个应用程序中,当用户访问没有auth cookie或过期的一个到受保护的页面时,ASP.NET发出HTTP 401未授权,则FormsAuthentication模块在请求结束之前拦截此响应,并将其更改为HTTP 302 Found,设置HTTP头“Location:/ path / loginurl”,以便将用户代理重定向到登录页面,然后浏览器转到该页面并检索未受保护的登录页面,获取HTTP 200 OK。 这是一个很好的主意,当AJAX没有被考虑。 现在我有一个url在我的应用程序,返回JSON数据,它需要用户进行身份验证。一切都很好,问题是,如果auth cookie过期,当我的客户端代码调用服务器,它将获得一个HTTP 200 OK与登录页面的html,而不是HTTP 401未授权(因为前面解释)。然后我的客户端尝试将登录页面html解析为json,并失败。 问题是:如何处理来自客户端的过期身份验证?什么是最优雅的解决方案来应对这种情况?我需要知道呼叫是否成功,我想使用HTTP语义。 是否可以以安全的跨浏览器方式从客户端读取自定义HTTP头? 我需要Forms验证,我想避免重写那个模块或者写我自己的表单验证模块。 问候。 解决方法我有同样的问题,并不得不使用自定义属性在MVC。你可以很容易地适应这在web表单中工作,如果所有的页面继承自一些基本页面(在MVC中的全局属性允许同样的事情 – 覆盖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;
}
这允许您的用户在会话过期时登录,而不会丢失他们的任何工作或最后显示的表单中键入的数据。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – 如何自动增加MVC 6版本号?
- asp.net-mvc – 与ASP.NET MVC等效的GetWebResourceUrl?
- asp.net-mvc – 如何在Kendo模板中动态设置列
- asp.net-mvc – 从MVC控制器调用异步方法
- ASP.NET编译器抱怨MiniProfiler不匹配的框架版本
- asp.net – 多个项目Visual Studio 2015 npm
- asp.net – 获取特定的会员提供商
- .net – DNU发布 – 来自MSBuild的no-source
- asp.net-mvc – Kendo UI异步上传无法在Internet Explorer中
- asp.net – 向GridView Row添加ID
- asp.net – 将JSON数据解析为.NET对象的最佳方式
- ASP.NET:如何重定向,预填充表单数据?
- asp.net-mvc – 从DataAnnotation类中渲染LabelF
- asp.net代码中修改web.config节点的具体方法
- asp.net – 设置gridview标题颜色
- asp.net – 一个页面只能有一个服务器端表单标签
- Jquery+ajax请求data显示在GridView上(asp.net)
- 在mvc4 asp.net中的Razor View中的模型声明
- asp.net-mvc – webgrid中的Mvc 3 texbox(razor)
- asp.net – 如何获得Url.Action使用正确的端口号
