【问题标题】:Authorize User Before Hitting Actions在点击操作之前授权用户
【发布时间】:2022-11-11 10:31:37
【问题描述】:

我想在执行控制器操作之前授权用户。在每个动作中,都有重复的代码行。

有没有一种方法可以让我能够在ControllerBase 中授权用户?

例如,我想有一个CustomControllerBase 将授权逻辑放在那里:

public class CustomBaseController : ControllerBase {
   // authorization logic
}

然后控制器继承自CustomBaseController

public class FooController : CustomBaseController {
}

这是我授权用户的方式:

var userItem = dbService.GetAuthorizedUser(User) // ClaimsPrincipal
if (userItem == null) return Unauthorized(ResponseMessage.UnAuthorized);

前 2 行代码在每个操作中运行。

【问题讨论】:

  • 我只能推测为什么有人投了反对票。我猜这是因为 ASP.NET (Core) 确实内置了 authentication and authorisation 机制。
  • @dropoutcoder,正如我所说,我想删除重复的代码行
  • 正如我试图解释的那样。有内置的机制应该用来做你想做的事。我从未见过直接在控制器类中使用安全性。您可能想改写问题或添加更多代码。
  • @dropoutcoder,我提供了更多细节。
  • 我知道您要做什么,但这应该完全在其他地方完成。让我把它写下来作为答案。

标签: c# asp.net-core .net-core controller


【解决方案1】:

我建议使用 ASP.NET (Core) 内置的安全功能。

仅授权经过身份验证的用户,除非在控制器或具有全局后备策略的操作上以不同方式指定。

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

启用身份验证和授权中间件。

app.UseAuthentication();
app.UseAuthorization();

创建具有所需逻辑的授权要求。

public class DefaultAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement>
{
    private IDbService _dbService;

    public DefaultAuthorizationHandler(IDbService dbService)
    {
        _dbService = dbService;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, OperationAuthorizationRequirement requirement)
    {
        // We skip as user is not authenticated. Nothing to authorize
        if (context.User == null)
        {
            return Task.CompletedTask;
        }

        // 
        var userItem = _dbService.GetAuthorizedUser(context.User);

        if (userItem != null)
        {
            context.Succeed(requirement);
        }

        // in some cases you want to have strict requirement
        // to force used to be denied even if other requirements are met.
        // context.Fail();

        return Task.CompletedTask;
    }
}

向 DI 注册授权处理程序。

builder.Services.AddScoped<IAuthorizationHandler, DefaultAuthorizationHandler>();

通过覆盖回退策略使登录端点允许匿名用户。

[AllowAnonymous]
public class LoginController
{
    ...
}

相关资源:

ASP.NET Core security topics

【讨论】:

  • 不客气。很高兴你解决了你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多