标签:
常授权取决于被访问的资源。例如一个文档可以具有作者属性。仅文档作者将被允许更新它,所以资源必须从文档库被加载可以由授权评估之前。这不能与一个授权属性来完成,因为属性的评估需要的数据绑定前,在你自己的代码的地方加载一个动作内的资源运行。相反的声明授权,属性的方法,我们必须使用必要的授权,其中一个开发者称他自己的代码中的授权功能。
写作基于资源授权的处理程序是不是太大的不同来写一个简单的要求处理。您创建一个需求,然后实现对需求的处理程序,指定要求的资源类型之前也。例如,这可能会接受一个文档资源将如下所示的处理程序;
公共 类 DocumentAuthorizationHandler : AuthorizationHandler < MyRequirement , 文档>
{
公众 覆盖 任务 HandleRequirementAsync (AuthorizationHandlerContext 背景下,
MyRequirement 要求,
文档 资源)
{
//验证对资源和身份的要求。
返回 任务。CompletedTask ;
}
}
不要忘了,你还需要注册在你的处理ConfigureServices
方法;
服务。AddSingleton < IAuthorizationHandler , DocumentAuthorizationHandler >();
如果您正在基于例如读取操作的决定,写,更新和删除,您可以使用OperationAuthorizationRequirement
类的Microsoft.AspNetCore.Authorization.Infrastructure
命名空间。此预建要求类,您可以编写具有参数化的操作名称,一个单一的处理程序,而不是为每个操作创建单独的类。要使用它提供了一些操作的名称:
公共 静态 类 操作
{
公共 静态 OperationAuthorizationRequirement 创建 =
新 OperationAuthorizationRequirement { 名称 = “创建” };
公共 静态 OperationAuthorizationRequirement 读 =
新 OperationAuthorizationRequirement { 名称 = “读取” };
公共 静态 OperationAuthorizationRequirement 更新 =
新 OperationAuthorizationRequirement { 名称 = “更新” };
公共 静态 OperationAuthorizationRequirement 删除 =
新 OperationAuthorizationRequirement { 名称 = “删除” };
}
然后,您的处理程序,可以实现如下,用一个假设的Document
类为资源;
公共 类 DocumentAuthorizationHandler :
AuthorizationHandler < OperationAuthorizationRequirement , 文档>
{
公众 覆盖 任务 HandleRequirementAsync (AuthorizationHandlerContext 背景下,
OperationAuthorizationRequirement 要求,
文档 资源)
{
//使用资源,身份和验证操作
从需求// Name属性值。
返回 任务。CompletedTask ;
}
}
你可以看到处理器上工作OperationAuthorizationRequirement
。处理程序中的代码使得其评估时必须考虑的要求提供Name属性考虑在内。
打电话给你打电话时需要指定动作的工作资源处理程序AuthorizeAsync
在你的行动。例如
如果 (的await authorizationService 。AuthorizeAsync (用户, 文件, 业务,读))
{
返回 查看(文档);
}
其他
{
返回 新 ChallengeResult ();
}
这个例子检查用户是否能够为当前执行读操作document
实例。如果授权成功将返回文档的视图。如果授权失败返回ChallengeResult
将通知任何身份验证的中间件授权失败和中间件可以采取适当的响应,例如返回一个401或403状态码,或将用户重定向到登录页面进行交互式浏览器客户端。
标签:
原文地址:http://www.cnblogs.com/duyao/p/5980085.html