这是我的基本控制器的代码,其想法是如果授权字符串不在 HTTP 标头中,我们会将它们踢出。我发誓它工作正常,现在突然不工作了。奇怪的是,当我调试它实际上是进入 if 语句,所以我请求的 HTTP 标头确实是一个 NULL 或 EMPTY 字符串,但是,它不再提前退出并返回 403 Access Denied ......它正在工作很好,突然之间,当我尝试解析实际上未找到的授权字符串时,它只是忽略了整个事情并最终在应用程序中崩溃。
public class AuthController : Controller
{
protected int AccountID;
protected override void OnAuthorization(AuthorizationContext filterContext)
{
//if no authorization string is provided, access denied
if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
{
filterContext.Result = Content("Access Denied", "text/plain");
filterContext.HttpContext.Response.StatusCode = 403; //forbidden
base.OnAuthorization(filterContext);
}
//otherwise grab the authorization string and validate it
string authString = filterContext.HttpContext.Request.Headers["Authorization"];
string urlPath = string.IsNullOrEmpty(filterContext.HttpContext.Request.Path) ? "" : filterContext.HttpContext.Request.Path;
int getAccountID = 0;
//if authorization fails...
if (!AuthCore.Authorize(authString, urlPath, ref getAccountID))
{
filterContext.Result = Content("Access Denied", "text/plain");
filterContext.HttpContext.Response.StatusCode = 403; //forbidden
base.OnAuthorization(filterContext);
}
//AccountID will never be zero at this point
AccountID = getAccountID;
//carry on with Controller Action, request is valid and AccountID is known
base.OnAuthorization(filterContext);
}
更新:刚试过 filterContext.Result = new HttpUnauthorizedResult(); 相反,结果相同。尝试解析未找到的标头字符串时,控制器操作继续并引发错误。
更新 2:添加了“return;” 在除最后一个之外的每个 base.OnAuthorization() 调用之后,现在当它失败时,我得到一个从 MVC 移动的 302,然后是一个 404,结果是该应用程序试图重定向到一个实际上并不实际的默认登录页面 URL存在......这是否足够好?也许,但我宁愿直接阻止它,而不是让一些不稳定的重定向发生作为阻止它们的方式,这对我来说并不安全。