我创建了一个Login系统,该系统在成功登录后为用户提供API密钥。 API密钥已附加访问级别。
我正在从前端发送每个Ajax请求的标头中的API密钥,但是它不再发送正确的响应。
这是我的控制者之一:
[AllowCrossSiteJson]
public class WebOrdersController : Controller
{
protected IWebOrdersService _webOrdersService = new WebOrdersService();
// GET: WebOrders
public ActionResult Index()
{
return View();
}
[WebOrdersAPIFilter]
public String GetTotals()
{
return _webOrdersService.GetAllTotals();
}
}
这是我的Filter类:
public class WebOrdersAPIFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
IAccountsService _accountsService = new AccountsService();
filterContext.RequestContext.HttpContext.Response.AddHeader("Authority", "*");
var rawUrl = HttpContext.Current.Request.RawUrl;
var routeArray = rawUrl.Split('/');
var route = routeArray[0].ToLower();
if (String.IsNullOrEmpty(route))
{
route = routeArray[1].ToLower();
}
var headers = filterContext.HttpContext.Request.Headers;
// Ensure that all of your properties are present in the current Request
if (!String.IsNullOrEmpty(headers["Authority"]))
{
var apiKey = headers["Authority"];
//GET API LEVEL
int accessLevel = _accountsService.CheckAPIKey(apiKey);
if(route == "weborders" && (accessLevel != 1 || accessLevel != 3 || accessLevel != 6))
{
filterContext.Result = new RedirectResult("http://localhost/error/unauthorised");
}
}
else
{
filterContext.Result = new RedirectResult("http://localhost/error/notloggedin");
}
base.OnActionExecuting(filterContext);
}
}
如果用户未登录,则不会在标头中发送API密钥,因此,如果不存在,则可以肯定地说他们已注销。如果他们已登录,则发送密钥。然后,我获取了他们键的访问级别并将其与路由进行比较。
我已调试它,发现route和accessLevel变量正常工作,但是即使它不返回并没有响应,并且如果IF()语句失败,它将返回/ error / unauthorized或/页面的html。错误/未登录,并且实际上没有重定向。
我如何实现我需要的功能,以确保请求数据的用户得到授权?