翻译以下: c#
一般受权取决于正在访问的资源。 例如,文档能够具备做者属性。 将只容许文档做者对其进行更新,所以必须在进行受权评估以前从文档存储库加载资源。 这不能使用Authorize属性来完成,由于属性评估发生在数据绑定以前,以及您本身的代码加载资源以前在一个动做中运行。 而不是声明性受权,属性方法,咱们必须使用命令式受权,开发人员在其本身的代码中调用受权函数。浏览器
为基于资源的受权编写处理程序与编写一个简单的需求处理程序没有太大的不一样。 您建立一个需求,而后为需求实现一个处理程序,指定前面的需求以及资源类型。 例如,可能接受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状态码,或将用户重定向到交互式浏览器客户端的登陆页面。