An efficient way to handle a session expiry is to create a custom Authorization attribute and return a HTTP 403 response if the session has expired and were dealing with an ajax request.
To create an Ajax aware authorization attribute you can inherit from AuthorizeAttribute and override the HandleUnauthorizedRequest event with a check on the type of request eg. IsAjaxRequest()
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
// Fire back an unauthorized response
filterContext.HttpContext.Response.StatusCode = 403;
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
Then just decorate your controllers or actions with the AjaxAuthorize attribute just as you normally would with Authorize
[AjaxAuthorize(Roles = "1,2,3,4,5")]
public class HomeController
{
Then if you're using jQuery you can handle the 403 response by creating a global ajax error handler.
$.ajaxSetup({
error: function (x, e) {
if (x.status == 403) {
alert("Sorry, your session has expired. Please login again to continue");
window.location = "/login";
}
}
});