2 回答

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方式的一個大問題是授權過濾器在模型綁定發(fā)生之前執(zhí)行。(只需查看ResourceInvoker類的源代碼。)您需要手動綁定模型以訪問其中授權所需的信息。然后框架會完成它的工作,導致模型綁定被完成兩次,從而導致性能下降。正如前面所描述的那樣,這應該并且可以避免。
更新
我剛剛注意到我不小心在 action 方法中留下了一段重要的代碼。更正。

TA貢獻1877條經驗 獲得超6個贊
在上述 AuthorizationHandler 中,我需要訪問一些傳遞給控制器的東西,例如路由中的 ID 或 DTO
請不要那樣做。您基本上是在復制有關如何從請求中解析參數(shù)的現(xiàn)有邏輯。
基本處理程序用于基本情況:例如,只有“BookClub”角色的經過身份驗證的成員才能訪問這些BooksController
方法。那太棒了。
一旦您發(fā)現(xiàn)自己需要來自消息本身的信息,請不要手動進行所有解析。讓 ASP 做它的事情并根據(jù)您給定的約束解析消息,然后當消息完成時,在您獲得的對象上調用您的授權邏輯。
- 2 回答
- 0 關注
- 381 瀏覽
添加回答
舉報