在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
需求:
在默认创建的Asp.Net MVC项目中(这里使用VS2013),需要手动返回一个401响应码给浏览器。我们的代码可能是下面这样子的。
实际的效果却和预期的不太一样,如果我们是通过地址栏直接访问这个Action,可以看到请求被重定向到登录页面了
如果通过Ajax的方式进行访问,可以看到直接返回了一个200的响应码
因为当前创建的MVC项目默认使用的是一个叫CookieAuthentication的OWIN中间件来实现身份认证的功能的,该中间件中会将401响应码进行特殊处理,所以导致我们无法手动返回401响应码。
Startup类中的代码:
所以如果你使用上述的中间件(使用其他的身份认证的组件也可能会存在重写401响应码的行为),那么就无法手动返回401响应码
如果需要手动返回401响应码,那么就需要在Asp.Net的生命周期中对相应做一些修改,查阅MSDN的资料可以看到PreSendRequestHeaders事件中比较适合做这个操作。
在Global中我们添加如下方法,在PreSendRequestHeaders事件中插入我们自己的代码,将响应码设置为我们预期想要的值
由于请求到这里的时候,响应码已经被重写,所以我们通过一个自定义的请求头来标识当前请求是一个要被手动发送给客户端的401响应
1 /// <summary> 2 /// 强制返回指定的响应码 3 /// 401响应码会被MVC框架和OWIN授权认证的中间件给重写 4 /// </summary> 5 public class ForceHttpStatusCodeResult : HttpStatusCodeResult 6 { 7 8 public const string ForceHttpUnauthorizedHeaderName = "ForceHttpUnauthorizedHeader"; 9 public const string ForceHttpUnauthorizedHeaderValue = "true"; 10 11 public ForceHttpStatusCodeResult(int state) 12 : this(state, "") 13 { } 14 15 public ForceHttpStatusCodeResult(int state, string statusDescription) 16 : base(state, statusDescription) 17 { 18 if (state == (int)HttpStatusCode.Unauthorized) 19 { 20 SetForceHttpUnauthorizedHeader(); 21 } 22 } 23 24 25 private void SetForceHttpUnauthorizedHeader() 26 { 27 System.Web.HttpContext.Current.Response.AddHeader(ForceHttpUnauthorizedHeaderName, ForceHttpUnauthorizedHeaderValue); 28 } 29 }
此时我们在Action中就可以返回我们需要的任意响应码了
Ajax请求结果:
下载:
参考资料:
|
请发表评论