如何在简单方法上使用授权属性,当我说简单方法时,意味着不是在控制器或页面方法上,而是真正简单的方法
大家好,我需要检查用户的访问权限,在内部服务的方法中,如何实现?
对于控制器或页面我们可以简单地使用授权属性,但是对于我们应用程序的内部服务该怎么办? 就像我有一个家庭控制器,并且在从应用程序层中的服务获取调用方法时,我想检查该用户对此服务是否有足够的权限,然后执行操作
正如我所说,我们可以在 Razor 的控制器或操作或页面上使用 Athorize 属性,但是我们的简单方法或类怎么样,我们可以检查那里的权限吗
从服务内部,您应该像这样进行授权
var isAuthenticated = httpContext?.User?.Identity?.IsAuthenticated ?? false;
要从自定义组件访问上述 httpContext,您应该使用 IHttpContextAccessor
要使用它,您必须添加 services.AddHttpContextAccessor();到启动文件的configurationServices。
下面是使用 IHttpContextAccessor 的示例
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor) =>
_httpContextAccessor = httpContextAccessor;
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
// ...
}
}
您正在尝试进行基于资源的授权
假设您已经制定了政策,您可以使用
AuthorizeAsync
中的
IAuthorizationService
方法
对于这个例子,假设我们正在尝试检查用户是否具有编辑文档的编辑权限
public async Task<IActionResult> OnGetAsync(Guid documentId)
{
Document = _documentRepository.Find(documentId);
if (Document == null)
{
return new NotFoundResult();
}
var authorizationResult = await _authorizationService
.AuthorizeAsync(User, Document, "EditPolicy");
if (authorizationResult.Succeeded)
{
//Call your service here
}
else
{
//This user don't have access
}
}
请参阅文档了解更多详细信息