主要实现Cookie过期后自动跳转登录页
public class UserAuthorization : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var description = (Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;
var Controllername = description.ControllerName.ToLower();
var Actionname = description.ActionName.ToLower();
//var RequestMethod = context.HttpContext.Request.Method;
//var ResponseStatusCode = context.HttpContext.Response.StatusCode;
//var RequestQurey = context.HttpContext.Request.QueryString.ToString();
//var RequestContextType = context.HttpContext.Request.ContentType;
//var RequestHost = context.HttpContext.Request.Host.ToString();
//var RequestPath = context.HttpContext.Request.Path;
//var RequestScheme = context.HttpContext.Request.Scheme;
//var RequestLocalIp = (context.HttpContext.Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.LocalPort);
//var RequestRemoteIp = (context.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() + ":" + context.HttpContext.Request.HttpContext.Connection.RemotePort);
//执行方法前先执行这
if (context.HttpContext.Request.Cookies["UserInfo.id"] == null)
{
//base.OnActionExecuting(context); //调用父类的该方法。
//获取是小写
if (Controllername == "home" && (Actionname == "login" || Actionname == "loginpost"))
{
//base.OnActionExecuting(context);
}
else
{
if (context.HttpContext.Request.Headers.ContainsKey("x-requested-with"))
{
if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
{
context.Result = new ContentResult() { Content = "{\"code\": 499,\"msg\": \"Cookie过期,请重新登录\",\"count\": 0,\"data\": null}", StatusCode = 200, ContentType= "application/json;" };
}
}
else
{
context.Result = new RedirectResult("/Home/Login"); //Redirect("/Home/Login");
}
}
}
}
}
登录页和退出页不验证。
判断是否异步,如果是返回对应的信息
if (context.HttpContext.Request.Headers.ContainsKey("x-requested-with"))
{
if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
{
context.Result = new ContentResult() { Content = "{\"code\": 499,\"msg\": \"Cookie过期,请重新登录\",\"count\": 0,\"data\": null}", StatusCode = 200, ContentType= "application/json;" };
}
}
异步我都是自己定义的状态编码和消息,所以直接状态返回的200,然后ContentType= "application/json;"返回的内容为json,就是自己的编码格式,作为异步判定跳转。
new ContentResult() { Content = "{\"code\": 499,\"msg\": \"Cookie过期,请重新登录\",\"count\": 0,\"data\": null}", StatusCode = 200, ContentType= "application/json;" };
非异步就直接跳转 new RedirectResult("/Home/Login");
另外说下,如果是框架中,有iframe的情况,会跳转到iframe中,那么需要在登录页加上下面的js
<script language="JavaScript">
if (window != top)
top.location.href = location.href;
</script>
那么就会自动跳转一下。