角色限制(AuthorizeAttribute)

首选,我看网上很多说System.Web.Mvc.AuthorizeAttribute的,有的只讲了用法,内部方法没有讲清,还有的说的太专业对于底层研究不深的朋友很不友好,因为这篇只是根据本人的胃口对MVC的这个组件进行整理

1.在网上看的资料 说以下的两块代码是 AuthorizeAttribute中,OnAuthorization和AuthorizeCore方法的源码 ,是不是源码我不清楚,如果小伙伴在其他平台有其它源代码请告知我,咱们全当源码分析吧

AuthorizeAttribute的执行方法是 如果某一控制器被标记Attribute,则来自于http的访问变会首先被过滤,第一步就是执行OnAuthorization();

public virtual void OnAuthorization(AuthorizationContext filterContext)
{
    if (filterContext == null)
    {
        throw new ArgumentNullException("filterContext");
    }

    if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
    {
        throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
    }

    bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
                             || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

    if (skipAuthorization)
    {
        return;
    }

    if (AuthorizeCore(filterContext.HttpContext))
    {
        HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
        cachePolicy.SetProxyMaxAge(new TimeSpan(0));
        cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
    }
    else
    {
        HandleUnauthorizedRequest(filterContext);
    }
}
protected virtual bool AuthorizeCore(HttpContextBase httpContext)
{
    if (httpContext == null)
    {
        throw new ArgumentNullException("httpContext");
    }

    IPrincipal user = httpContext.User;
    if (!user.Identity.IsAuthenticated)
    {
        return false;
    }

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
    {
        return false;
    }

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
    {
        return false;
    }

    return true;
}
```我们可以看到OnAuthorization方法中 在一系列的非空,缓存等验证后调用了AuthorizeCore权限验证方法,如果验证通过则出方法,如果不通过则调用HandleUnauthorizedRequest()方法


因此我们在自己的继承类可以从写这三个方法达到权限验证
OnAuthorization()为入口方法
AuthorizeCore()验证方法
HandleUnauthorizedRequest()验证失败后的跳转路径

当然我们可以只从写OnAuthorization()这一个方法  在里面完成所有操作
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 .NET 6 中,`AuthorizeAttribute` 仍然是用于进行身份验证和授权的重要特性之一。它用于标记需要进行身份验证的控制器或动作方法,并确保只有经过身份验证的用户才能访问它们。 要在 .NET 6 中使用 `AuthorizeAttribute`,你可以按照以下步骤操作: 1. 在你的控制器或动作方法上添加 `AuthorizeAttribute` 特性。例如: ```csharp [Authorize] public IActionResult MyAuthorizedAction() { // 这个动作方法需要进行身份验证才能访问 // ... } ``` 2. 根据你的需求,你可以通过 `Roles`、`Policy`、`AuthenticationSchemes` 等属性对 `AuthorizeAttribute` 进行进一步配置。例如: ```csharp [Authorize(Roles = "Admin", Policy = "CustomPolicy", AuthenticationSchemes = "Bearer")] public IActionResult MyAuthorizedAction() { // 这个动作方法需要进行身份验证,并且用户必须是 "Admin" 角色、满足 "CustomPolicy" 策略,并使用 "Bearer" 认证方案进行认证 // ... } ``` 注意,以上示例中使用的 `AuthorizeAttribute` 是命名空间 `Microsoft.AspNetCore.Authorization` 中的类。确保你的项目引用了正确的依赖项并导入了正确的命名空间。 另外,你可能还需要配置身份验证和授权的其他相关设置,例如身份验证方案、策略等。这些设置可以在 `Startup.cs` 文件中的 `ConfigureServices` 方法中进行配置。例如: ```csharp public void ConfigureServices(IServiceCollection services) { // ... services.AddAuthentication("Bearer") .AddJwtBearer("Bearer", options => { // 配置 JWT Bearer 认证选项 // ... }); services.AddAuthorization(options => { options.AddPolicy("CustomPolicy", policy => { // 配置自定义策略 // ... }); }); // ... } ``` 请根据你的具体需求进行适当的配置和调整。希望这些信息对你有所帮助!如果你有更多问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值