【问题标题】:Authorization in WebApiWebApi 中的授权
【发布时间】:2016-05-11 21:34:10
【问题描述】:

我正在使用 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() 方法):“此请求的授权已被拒绝。”我不明白为什么 - 我的用户有一个角色 Admin(这就是我什至能够进入管理页面的原因),如果我从 GetEcho() 方法中删除 [Authorize] 然后在其中设置一个断点,我看到正确的用户对象。任何想法我做错了什么?

【问题讨论】:

  • 向我们展示你的 jquery-ajax 调用
  • @CodeNotFound - 使用 ajax 调用更新
  • 您使用哪种身份验证? Windows、Active Directory、外部提供程序?
  • 内置 ASP.NET 身份验证机制,带有登录名和密码。一个新的 MVC 项目附带的一个(以前称为 forms auth - 新名称是什么?)
  • 那将使用 cookie 而不是令牌。作为一种解决方法,您可以在发送 ajax 请求时将 withCredentials 设置为 true,但这不是最佳解决方案。

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


【解决方案1】:

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

[Authorize(Roles = "Admin")]

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

[Authorize(Roles = "admin")]

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

【讨论】:

    【解决方案2】:

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

    在普通的 jQuery 中它可能看起来像

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2014-10-28
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多