WebApi 中的授权

Authorization in WebApi

我正在使用 AdminColntroller 构建管理页面 (MVC 5):

[Authorize(Roles = "Admin")]
public class AdminController : ApplicationBaseController
{
    public ActionResult Index()
    {
        return View();
    }
}

我想将其实现为单页应用程序,因此我将在客户端 ajax 调用管理网站 api,我还想保护对它的访问:

[RoutePrefix("api/admin")]
[Authorize(Roles = "admin")]
public class AdminApiController : ApiController
{
    [Route("echo")]
    public HttpResponseMessage GetEcho()
    {
        return Request.CreateResponse(HttpStatusCode.OK, new {Result = "Hello World"});
    }
}

这是我从管理员视图中发出的 ajax 调用:

<script>
    jQuery.ajax("https://example.com/api/admin/echo").done(function(data) {
        console.log(data);
    }).fail(function(a,b,c) {
        console.log(a);
    });
</script>

这会引发错误(fail() 方法):"Authorization has been denied for this request." 我不明白为什么 - 我的用户具有 Admin 角色(这就是我什至能够进入管理页面的原因),并且如果我从 GetEcho() 方法中删除 [Authorize] 然后在其中设置一个断点,我会看到正确的 User 对象。知道我做错了什么吗?

您始终必须在 API 请求中携带您的身份验证数据或用户令牌(基于您使用的身份验证方式)。

简单来说jQuery它可能看起来像

$.ajax({ beforeSend: function (xhr) { xhr.setRequestHeader("ownToken", authToken);

您遇到的问题是针对 MVC 控制器,您遇到的是:

[Authorize(Roles = "Admin")]

针对 API 控制器,您有:

[Authorize(Roles = "admin")]

角色检查区分大小写。如果将 API 控制器更改为使用 Admin 而不是 admin,应该可以解决问题。