我应该使用哪种方法:IsAuthorized还是OnAuthorization? ( 要么 何时使用哪个)
你会延长 AuthorizationFilterAttribute 如果您的授权逻辑不依赖于已建立的身份和角色。对于用户相关的授权,您将进行扩展和使用 AuthorizeAttribute 。对于前一种情况,您将覆盖 OnAuthorization 。对于后一种情况,您将覆盖 IsAuthorized 。正如您从这些属性的源代码中看到的那样, OnAuthorization 标记为虚拟,如果您派生自,则覆盖 AuthorizationFilterAttribute 。另一方面, IsAuthorized 方法标记为虚拟 AuthorizeAttribute 。我相信这是一个很好的指向预期用途的指针。
AuthorizationFilterAttribute
AuthorizeAttribute
OnAuthorization
IsAuthorized
我应该什么时候打电话给base.IsAuthorized或base.OnAuthorization?
这个问题的答案在于OO如何运作。如果覆盖方法,则可以完全提供新实现,也可以依靠父级提供的实现来增强行为。例如,以案例为例 IsAuthorized(HttpActionContext) 。基类行为是根据过滤器中指定的内容与建立的标识检查用户/角色。说,你想做所有这些,但另外,你想检查别的东西,可能是基于请求标题或其他东西。在这种情况下,您可以提供这样的覆盖。
IsAuthorized(HttpActionContext)
protected override bool IsAuthorized(HttpActionContext actionContext) { bool isAuthroized = base.IsAuthorized(actionContext); // Here you look at the header and do your additional stuff based on actionContext // and store the result in isRequestHeaderOk // Then, you can combine the results // return isAuthorized && isRequestHeaderOk; }
对不起,但不明白你的Q3。 BTW,授权过滤器已经存在了很长时间,人们将它用于各种事情,有时甚至是错误的。
还有一件事。最后这里有个人说:你 不应该覆盖OnAuthorization - 因为你会丢失 [AllowAnonymous]处理。
那个说那是门禁之神的人 - 多米尼克。显然这是正确的。如果你看一下执行情况 OnAuthorization (复制如下),
public override void OnAuthorization(HttpActionContext actionContext) { if (actionContext == null) { throw Error.ArgumentNull("actionContext"); } if (SkipAuthorization(actionContext)) { return; } if (!IsAuthorized(actionContext)) { HandleUnauthorizedRequest(actionContext); } }
打电话给 SkipAuthorization 是确保的部分 AllowAnonymous 应用过滤器,即跳过授权。如果重写此方法,则会丢失该行为。实际上,如果您决定将授权建立在用户/角色的基础上,那么您将决定从中获取 AuthorizeAttribute 。此时只剩下正确的选项将覆盖 IsAuthorized 而不是已经被覆盖的 OnAuthorization ,虽然技术上可以做到。
SkipAuthorization
AllowAnonymous
PS。在ASP.NET Web API中,还有另一个称为身份验证过滤器的过滤器。想法是您使用它进行身份验证和授权过滤器进行授权,如名称所示。但是,有很多这样的边界被捏造的例子。许多authroization过滤器示例将执行某种身份验证。无论如何,如果你有时间并想要了解更多,请看看这个MSDN 文章 。免责声明:这是我写的。
好的,我的建议是假设您使用OAuth承载令牌来保护您的Web API并且您在发布令牌时将allowedTime设置为用户声明,请执行以下操作。你可以阅读更多相关信息 基于令牌的身份验证
覆盖方法 OnAuthorizationAsync 并使用以下示例代码:
OnAuthorizationAsync
public class CustomAuthorizeAttribute : AuthorizationFilterAttribute { public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken) { var principal = actionContext.RequestContext.Principal as ClaimsPrincipal; if (!principal.Identity.IsAuthenticated) { return Task.FromResult<object>(null); } var userName = principal.FindFirst(ClaimTypes.Name).Value; var userAllowedTime = principal.FindFirst("userAllowedTime").Value; if (currentTime != userAllowedTime) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Not allowed to access...bla bla"); return Task.FromResult<object>(null); } //User is Authorized, complete execution return Task.FromResult<object>(null); } }
ASP.NET v5引入了一个全新的授权系统。 对于那些打算使用.NET 5的人,我建议进入Microsoft.AspNet.Authorization。
它几乎包含了保持两者造成的混乱 System.Web.Http.Authorize 和 System.Web.Mvc.Authorize 和其他旧的身份验证实现。
System.Web.Http.Authorize
System.Web.Mvc.Authorize
它提供了动作类型(创建,读取,更新,删除),资源,角色,声明,视图,自定义要求的非常好的抽象,并允许构建自定义处理程序,结合上述任何一种。 此外,这些处理程序也可以组合使用。
在ASP.NET v5中,授权现在提供简单的声明性角色和a 更丰富的基于政策的模型,其中表示授权 要求和处理程序评估用户的声明 要求。强制性检查可以基于简单的策略或 评估用户身份和属性的策略 用户尝试访问的资源。