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
,应该可以解决问题。
我正在使用 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
,应该可以解决问题。