2 回答
![?](http://img1.sycdn.imooc.com/5333a1920001d36402200220-100-100.jpg)
TA贡献1859条经验 获得超6个赞
你最好在你的操作方法中处理这种情况:
public class SomeController : Controller
{
private readonly IAuthorizationService _authorizationService;
public SomeController(IAuthorizationService authorizationService)
{
_authorizationService = authorizationService;
}
public async Task<IActionResult> Create([FromForm]MyCustomDto myDto)
{
var authorizationResult = await _authorizationService.AuthorizeAsync(User, myDto, "MyCustomPolicy");
if (!authorizationResult.Succeeded)
return User.Identity.IsAuthenticated ? Forbid() : (IActionResult)Challenge();
// Do some stuff here
}
你像这样定义你的授权处理程序:
public class MyCustomDtoAuthorizationHandler : AuthorizationHandler<MyCustomDtoRequirement, MyCustomDto>
{
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MyCustomDtoRequirement requirement, MyCustomDto resource)
{
// your authorization logic based on the resource argument...
}
}
选择AuthorizeFilter方式的一个大问题是授权过滤器在模型绑定发生之前执行。(只需查看ResourceInvoker类的源代码。)您需要手动绑定模型以访问其中授权所需的信息。然后框架会完成它的工作,导致模型绑定被完成两次,从而导致性能下降。正如前面所描述的那样,这应该并且可以避免。
更新
我刚刚注意到我不小心在 action 方法中留下了一段重要的代码。更正。
![?](http://img1.sycdn.imooc.com/533e4c2300012ab002200220-100-100.jpg)
TA贡献1877条经验 获得超6个赞
在上述 AuthorizationHandler 中,我需要访问一些传递给控制器的东西,例如路由中的 ID 或 DTO
请不要那样做。您基本上是在复制有关如何从请求中解析参数的现有逻辑。
基本处理程序用于基本情况:例如,只有“BookClub”角色的经过身份验证的成员才能访问这些BooksController
方法。那太棒了。
一旦您发现自己需要来自消息本身的信息,请不要手动进行所有解析。让 ASP 做它的事情并根据您给定的约束解析消息,然后当消息完成时,在您获得的对象上调用您的授权逻辑。
- 2 回答
- 0 关注
- 346 浏览
添加回答
举报