我刚学习ASP.NET MVC和新手,所以我找不到解决某些问题的方法。也许有人遇到这个问题,可以给我建议吗?谢谢大家!
在我的项目中,我使用ASP.NET Identity进行授权。 我遇到的唯一问题是如何在会话到期后将用户重定向到登录页面。如果来自控制器的动作不是从AJAX调用它可以很好地工作,但是如果从AJAX函数调用动作它会崩溃。我寻找解决方案,但我发现的一切都不适合我。 现在我的代码看起来像:
Startup.cs
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext<ApplicationContext>(ApplicationContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Home/Login"),
LogoutPath = new PathString("/Home/Login"),
ExpireTimeSpan = TimeSpan.FromMinutes(1),
});
}
Web.config
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Home/Login" timeout="1" />
</authentication>
</system.web>
来自JS的函数调用action:
function click(d) {
//Some logic
$.ajax({
url: '@Url.Action("GetDataForNode", "Home")',
type: 'POST',
dataType: 'json',
cahe: false,
data: { uid: d.id, index: index, nodesUid: nodesUid, request },
success: function (results) {
//Some logic
},
error: function (xhr) {
if (xhr.status === 401) {
window.location.href = xhr.Data.LogOnUrl;
return;
}
}
})
}
在控制器中我创建了:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 401;
filterContext.Result = new JsonResult
{
Data = new
{
Error = "NotAuthorized",
LogOnUrl = FormsAuthentication.LoginUrl
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.HttpContext.Response.End();
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
答案 0 :(得分:-1)
将生命周期方法Application_EndRequest处理程序添加到global.asax.cs中的代码中。每个请求都将以此方法结束,当您的请求未经授权时,此方法将允许您重定向到适当的操作(401),只需重定向到适当的操作。
protected void Application_EndRequest()
{
// redirected to the login page.
var context = new HttpContextWrapper(Context);
if (context.Request.IsAjaxRequest() && context.Response.StatusCode == 401)
{
new RedirectResult("~/Account/Login");
}
}
}