繁体   English   中英

如何防止ASP.NET MVC 5将用户重定向到登录页面?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM