WebApi中的授权

时间:2016-02-02 21:42:07

标签: asp.net-mvc asp.net-web-api asp.net-mvc-5 asp.net-web-api2 asp.net-authorization

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

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

我想将它作为单页面应用程序实现,因此我将对管理员web api进行客户端ajax调用,我也希望能够访问:

[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()方法):&#34;此请求已拒绝授权。&#34;我不明白为什么 - 我的用户有管理员角色(这就是为什么我甚至可以进入管理页面),以及我是否从[Authorize]方法移除GetEcho()然后在其中设置断点,我看到正确的User对象。我有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你遇到的问题是,对于MVC控制器,你有这个:

[Authorize(Roles = "Admin")]

虽然针对API控制器,但您有:

[Authorize(Roles = "admin")]

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

答案 1 :(得分:-1)

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

在简单的jQuery中它可能看起来像

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