首页 文章

Web API身份验证(没有asp.net标识)

提问于
浏览
0

是否可以在不使用asp.net身份的情况下验证Web API?

我在同一个解决方案中有一个MVC和一个Web API项目,在MVC项目中我有一个非常小的管理区域,用登录名和密码保护(仅供一个用户使用) . 在这个区域,我使用API调用获取clinet端的数据 .

这是我的登录功能:

public ActionResult SubmitLogin(string UserName, string Password)
    {
        if (ModelState.IsValid)
        {
            if (UserName == "xxxxx" && Password == "yyyyy")
            {
                FormsAuthentication.SetAuthCookie(UserName, true);
                return RedirectToAction("Index", @"Admin/Users");
            }
        }
        var errors = (from value in ModelState.Values
                      from error in value.Errors
                      select error.ErrorMessage).ToList();

        if (errors.Count == 0)
        {
            errors.Add("UserName or Password are incorrect");
        }

        ViewBag.Message = errors;
        return View("Index");
    }

登录表单工作正常,我的问题是API调用,我的API控制器是 [Authorize] 但是当我提出请求时:

self.getUsers = function (callback) {
    $.get("../MySite.API/Users/GetUsers/", callback);
}

我收到401错误 .

我知道我必须以某种方式发送 AuthCookie 但我不确定如何 .

任何帮助,将不胜感激 .

1 回答

  • 0

    在执行操作之前,您可以创建自己的 AuthorizationFilterActionFilter 来检查用户的身份验证和授权 .

    这只是一个如何使用 ActionFilter 完成的示例 . 您可以根据需要设计自己的:

    public class CanEditReport : ActionFilterAttribute  
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var reportID = Convert.ToInt32(filterContext.ActionParameters["id"]);
            var report = ReportsManager.GetByID(reportID);
            int userID = 0;
            bool hasID = int.TryParse(filterContext.HttpContext.Session["CurrentUserID"].ToString(), out userID);
            if (!hasID)
            {
                filterContext.Controller.TempData["FlashMessage"] = "Please select a valid User to access their reports.";
                //Change the Result to point back to Home/Index
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index" }));
            }
            else //We have selected a valid user
            {
                if(report.UserID != userID)
                {
                    filterContext.Controller.TempData["FlashMessage"] = "You cannot view Reports you have not created.";
                    //Change the Result to point back to Home/Index
                    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index" }));
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
    

相关问题