ASP.NET Core--基于受权的资源

翻译以下: c#

  一般受权取决于正在访问的资源。 例如,文档能够具备做者属性。 将只容许文档做者对其进行更新,所以必须在进行受权评估以前从文档存储库加载资源。 这不能使用Authorize属性来完成,由于属性评估发生在数据绑定以前,以及您本身的代码加载资源以前在一个动做中运行。 而不是声明性受权,属性方法,咱们必须使用命令式受权,开发人员在其本身的代码中调用受权函数。浏览器

在代码中受权

  受权被实现为服务,AuthorizationService,在服务集合中注册而且经过依赖注入可用于控制器访问。async

 
public class DocumentController : Controller
{
    IAuthorizationService _authorizationService;

    public DocumentController(IAuthorizationService authorizationService)
    {
        _authorizationService = authorizationService;
    }
}

  IAuthorizationService接口有两种方法,一种是传递资源和策略名称,另外一种是传递资源的地方和要求求值的需求列表。ide

Task<bool> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          IEnumerable<IAuthorizationRequirement> requirements);
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          string policyName);

  要调用服务在您的操做中加载您的资源,而后调用您须要的AuthorizeAsync重载。 例如:函数

public async Task<IActionResult> Edit(Guid documentId)
{
    Document document = documentRepository.Find(documentId);

    if (document == null)
    {
        return new HttpNotFoundResult();
    }

    if (await authorizationService.AuthorizeAsync(User, document, "EditPolicy"))
    {
        return View(document);
    }
    else
    {
        return new ChallengeResult();
    }
}
 

编写一个资源处理程序

  为基于资源的受权编写处理程序与编写一个简单的需求处理程序没有太大的不一样。 您建立一个需求,而后为需求实现一个处理程序,指定前面的需求以及资源类型。 例如,可能接受Document资源的处理程序将以下所示:ui

public class DocumentAuthorizationHandler : AuthorizationHandler<MyRequirement, Document>
{
    public override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                MyRequirement requirement,
                                                Document resource)
    {
        // Validate the requirement against the resource and identity.

        return Task.CompletedTask;
    }
}

  不要忘记你还须要在ConfigureServices方法中注册你的处理程序;spa

services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();

操做要求

   若是您根据读取,写入,更新和删除等操做进行受权决策,则能够在Microsoft.AspNetCore.Authorization.Infrastructure命名空间中使用OperationAuthorizationRequirement类。 这个预构建的类使您可以编写具备参数化操做名称的单个处理程序,而不是为每一个操做建立单独的类。 要使用它提供一些操做名称:翻译

 

public static class Operations
{
    public static OperationAuthorizationRequirement Create =
        new OperationAuthorizationRequirement { Name = "Create" };
    public static OperationAuthorizationRequirement Read =
        new OperationAuthorizationRequirement   { Name = "Read" };
    public static OperationAuthorizationRequirement Update =
        new OperationAuthorizationRequirement { Name = "Update" };
    public static OperationAuthorizationRequirement Delete =
        new OperationAuthorizationRequirement { Name = "Delete" };
}

  而后,您的处理程序能够以下实现,使用假设的Document类做为资源;code

public class DocumentAuthorizationHandler :
    AuthorizationHandler<OperationAuthorizationRequirement, Document>
{
    public override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                OperationAuthorizationRequirement requirement,
                                                Document resource)
    {
        // Validate the operation using the resource, the identity and
        // the Name property value from the requirement.

        return Task.CompletedTask;
    }
}

  您能够看处处理程序在操做受权要求上工做。 处理程序中的代码在进行评估时必须考虑提供的需求的Name属性。中间件

    要调用操做资源处理程序,您须要在操做中调用AuthorizeAsync时指定操做。 例如:

if (await authorizationService.AuthorizeAsync(User, document, Operations.Read))
{
    return View(document);
}
else
{
    return new ChallengeResult();
}

  此示例检查用户是否可以对当前文档实例执行读取操做。 若是受权成功,将返回文档的视图。 若是受权失败返回ChallengeResult将通知任何认证中间件受权失败,中间件能够采起适当的响应,例如返回401或403状态码,或将用户重定向到交互式浏览器客户端的登陆页面。

相关文章
相关标签/搜索