![](/img/trans.png)
[英]Redirecting Anonymous User or wrong user type to login page within a specific controller in ASP.net MVC 3
[英]How to prevent ASP.NET MVC 5 from redirecting the user to the login page?
我有一个使用c#编写的ASP.NET MVC 5应用程序。 一些端点用于应用程序本身,而其他端点仅用于API调用。 API端点返回JsonResult
。
我希望在用户尚未登录或用户未经授权时,API始终返回JSON
而不是进行重定向。
因此,我创建了一个名为ApiAuthorizeAttribute
的新Authorize-Attribute,该属性只能在我的API端点上使用。
这是ApiAuthorizeAttribute
类的外观
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class ApiAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAuthenticated)
{
int httpCode = (int)System.Net.HttpStatusCode.Unauthorized;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
filterContext.HttpContext.Response.StatusCode = httpCode;
filterContext.HttpContext.Response.ContentType = "application/json";
filterContext.HttpContext.Response.Write(JsonConvert.SerializeObject(
new BaseResource(false, httpCode, "Request Forbidden. You must first login!")
)
);
//filterContext.HttpContext.Response.End();
filterContext.Result = new HttpStatusCodeResult(httpCode);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
但是,即使用户未经授权,该框架仍会将用户重定向到我试图避免的登录页面。 我可以看到请求转到我的代码的if(!filterContext.HttpContext.Request.IsAuthenticated
){...}`部分,因为它仍然将用户重定向到登录页面。
更新
如果我取消注释filterContext.HttpContext.Response.End();
行并使用Visual Studio逐步执行代码。 该页面正确显示我的JSON。 但是,当代码完成在控制器中调用“ Dispose()”方法时,我得到了来自浏览器The connection was reset
错误,这似乎是某种重定向错误。
如何正确防止框架重定向用户?
我解决了这个问题。 这是因为我返回了401错误代码。 所以这就是我将代码更改为
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class ApiAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAuthenticated)
{
int httpCode = (int)System.Net.HttpStatusCode.Unauthorized;
filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
filterContext.HttpContext.Response.StatusCode = 200;
filterContext.HttpContext.Response.ContentType = "application/json";
filterContext.HttpContext.Response.Write(JsonConvert.SerializeObject(
new BaseResource(false, httpCode, "Request Forbidden. You must first login!")
)
);
filterContext.Result = new HttpStatusCodeResult(200);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.