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

时间:2017-05-23 06:00:26

标签: c# asp.net-mvc authentication asp.net-web-api asp.net-mvc-5

是否可以在不使用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 :(得分: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);
    }
}