authorize-attribute - 无法导致调用自定义 AuthorizeAttribute
问题描述
身份验证有效。一切都好,不用担心,如果我不发送正确的令牌,我会得到 401。
我想做的是按用户控制 REST API 方法。因此,我被告知要做到这一点的方法是将属性放在从 AuthorizeAttribute 派生的方法上。
我试图实现一种拒绝访问 MakeComplexNote 方法的简单方法。
问题是属性中的代码永远不会被调用。曾经。除了构造函数。
我不关心我正在尝试做的事情的优点。我只是想知道机械。我厌倦了与这个斗争。如何用尽可能少的代码做到这一点?
这是我的控制器:
using FleetApi.AuthProvider;
using System.Web.Http;
namespace FleetApi.Controllers
{
public class MakeSimpleNoteRequest
{
public string Content { get; set; }
}
public class MakeSimpleNoteResponse
{
public string FinalNote { get; set; }
}
[Authorize]
[RoutePrefix("api/notes")]
public class NotesController : ApiController
{
[HttpPost]
[Route(nameof(MakeSimpleNote))]
public MakeSimpleNoteResponse MakeSimpleNote([FromBody] MakeSimpleNoteRequest request)
{
return new MakeSimpleNoteResponse()
{
FinalNote = request?.Content?.ToUpper(),
};
}
[HttpPost]
[Route(nameof(MakeComplexNote))]
[FleetAuthorize]
public MakeSimpleNoteResponse MakeComplexNote([FromBody] MakeSimpleNoteRequest request)
{
return new MakeSimpleNoteResponse()
{
FinalNote = "COMPLEX:" + (request?.Content?.ToUpper()),
};
}
}
}
这是自定义属性
using System;
using System.Web;
using System.Web.Mvc;
namespace FleetApi.AuthProvider
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class FleetAuthorizeAttribute : AuthorizeAttribute
{
public FleetAuthorizeAttribute()
{
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return false;
}
}
}
解决方案
我想我终于找到了答案。我需要使用
using System.Web.Http;
代替
using System.Web.Mvc;
获取我的属性的基类
using System;
using System.Linq;
using System.Net.Http;
using System.Security.Claims;
using System.Web.Http;
using System.Web.Http.Controllers;
namespace FleetApi.AuthProvider
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class FleetAuthorizeAttribute : AuthorizeAttribute
{
public FleetAuthorizeAttribute()
{
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
return false;
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
actionContext.Response.Content = new StringContent("{}");
}
}
}
推荐阅读
- c++ - C++ -1 index has value of last index element ? Huh?
- android - 将数字字符串格式化为 2 个十进制双精度数,与数字字符串长度无关
- powershell - 如何使用 PowerShell 在行位置的文件中插入新行?
- javascript - D&D 翻页计数器
- javascript - 按选择元素的值过滤组件
- php - Blade 模板中的 Laravel 对象访问
- c++ - 防止类的临时实例化
- javascript - 如何防止在 React 中重新加载?
- laravel - 没有用户模型的 Laravel 护照 createToken
- python - 如何使用 python 3.8 在 tkinter 的画布中创建滚动条