代码改变世界

ABP点滴:API无权访问资源时,返回 PolicyName 信息

2023-06-18 19:52 by 无常, 阅读(216) 阅读, 推荐(0) 推荐, 收藏, 编辑

ABP无权访问API时,返回的是403 Forbidden 和重定向 Localtion ,但不知道具体是哪个Policy受阻。
整改思路:

  1. 重写 MethodInvocationAuthorizationService, 抛出AbpAuthorizationException异常时附带 PolicyName
  2. 重写 DefaultAbpAuthorizationExceptionHandler ,在http响应头中增加上无权限的 PolicyName。
  3. 前端判断返回403再从headers中获取

效果如:

image

相关源码:


[ExposeServices(typeof(IAbpAuthorizationExceptionHandler))]
[Dependency(ReplaceServices = true)]
public class Ch2AuthorizationExceptionHandler : DefaultAbpAuthorizationExceptionHandler
{
    public Ch2AuthorizationExceptionHandler()
    {
    }

    public override Task HandleAsync(AbpAuthorizationException exception, HttpContext httpContext)
    {
        if (exception.Data.Contains("PolicyName"))
        {
            var policyName = (string)exception.Data["PolicyName"]!;
            httpContext.Response.Headers.Add("X-Policy-Name", new Microsoft.Extensions.Primitives.StringValues(policyName));
        }

        return base.HandleAsync(exception, httpContext);
    }
}



[ExposeServices(typeof(IMethodInvocationAuthorizationService))]
[Volo.Abp.DependencyInjection.Dependency(ReplaceServices = true)]
public class Ch2MethodInvocationAuthorizationService : IMethodInvocationAuthorizationService, ITransientDependency
{
    private readonly IAbpAuthorizationPolicyProvider _abpAuthorizationPolicyProvider;
    private readonly IAbpAuthorizationService _abpAuthorizationService;

    public Ch2MethodInvocationAuthorizationService(
        IAbpAuthorizationPolicyProvider abpAuthorizationPolicyProvider,
        IAbpAuthorizationService abpAuthorizationService)
    {
        _abpAuthorizationPolicyProvider = abpAuthorizationPolicyProvider;
        _abpAuthorizationService = abpAuthorizationService;
    }

    public async Task CheckAsync(MethodInvocationAuthorizationContext context)
    {
        if (AllowAnonymous(context))
        {
            return;
        }

        var authorizationPolicy = await AuthorizationPolicy.CombineAsync(
            _abpAuthorizationPolicyProvider,
            GetAuthorizationDataAttributes(context.Method)
        );

        if (authorizationPolicy == null)
        {
            return;
        }

        //改动这里
        //await _abpAuthorizationService.CheckAsync(authorizationPolicy);
        if (!await _abpAuthorizationService.IsGrantedAsync(authorizationPolicy))
        {
            var policys = authorizationPolicy.Requirements.Cast<PermissionRequirement>()
                .Select(o => o.PermissionName).JoinAsString(",");
            throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted)
                .WithData("PolicyName", policys);
        }
    }

    protected virtual bool AllowAnonymous(MethodInvocationAuthorizationContext context)
    {
        return context.Method.GetCustomAttributes(true).OfType<IAllowAnonymous>().Any();
    }

    protected virtual IEnumerable<IAuthorizeData> GetAuthorizationDataAttributes(MethodInfo methodInfo)
    {
        var attributes = methodInfo
            .GetCustomAttributes(true)
            .OfType<IAuthorizeData>();

        if (methodInfo.IsPublic && methodInfo.DeclaringType != null)
        {
            attributes = attributes
                .Union(
                    methodInfo.DeclaringType
                        .GetCustomAttributes(true)
                        .OfType<IAuthorizeData>()
                );
        }

        return attributes;
    }
}


使用MSBUILD 构建时出错 error MSB3086: Task could not find "sgen.exe" using the SdkToolsPath

2011-11-22 22:39 by 无常, 阅读(2268) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:如果项目有添加有WB引用,比如引用其它网站的WEB服务等,那么VS在编译时会自动生成个 [项目名称].Serializers.dll的文件,就是把引用服务中的相关对象信息生成硬编码的程序集,以提高效率。 但是,如果在远程服务器上使用msbuil构建时,服务器上如果没安装有winsdk,那么构建就会失败,出现类似这样的信息: (GenerateSerializationAssemblies ta... 阅读全文

PPTPD默认MTU太大引起一些网站上不了的问题

2011-11-21 22:23 by 无常, 阅读(12222) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:代理服务器更换centos6半月有余,更换后发现wint系统拨号后访问 sina.com.cn / iciba.com / 360.com 等部分网站时页面打不开,而在服务器上或和机房内直接用通过服务器做网关的其它机器都能正常访问,一直不到其解。 今晚搜索了一下,找到些资料,发现是PPTPD默认的MTU太大,导致链路上有些设备堵塞。 解决思路就是把MTU改小些,方法大概有三种: 一、如果开启... 阅读全文

CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记

2011-10-04 17:33 by 无常, 阅读(7622) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:没想到安装过程这么曲折,gem安装时下载经常是不成功的,无耐只好把.gem文件下载回来再本地安装,加上radmine 1.2.1对各组件的版本了也比较挑剔,中间走了不少弯路,折腾了二天时间,终于摸清路子。顺便把安装方法记录下来。0.安装相关的软件包 1:# yum install httpd httpd-devel openssl-devel\ zlib-devel gcc gcc-c++ curl-devel subversion -y1.安装MySql数据库安装MySQL ,并设置为开机自动启动。 1: # yum install mysql mysql-devel mysql-... 阅读全文

MVC3中实现验证提示信息多语言支持

2011-05-30 00:26 by 无常, 阅读(6399) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:导言在上一篇博文中提出一种通过自定义验证适配器自定义模验证提示信息的方法,实现了修改System.ComponentModel.DataAnnotations中提供的默认验证信息,但此方法是把提示信息写死在代码中,不够灵活,比如要多语言支持的情况下,就无能为力了。本文便继续加以完善,在上文方法的基础上,实现验证提示信息的多语言支持。改造MyRequiredAttributeAdapter即是要实现多语言支持,那么提示信息就不能写死在适配器中了。多语言信息内容,一般是保存在独立的XML文件中或者使用ASP.NET中内置的资源文件,本文使用后者。为了实现更灵活的验证信息,参考了这篇博文的方法,使用 阅读全文

MVC3中使用验证适配器修改默认的验证提示信息

2011-05-29 14:36 by 无常, 阅读(5795) 阅读, 推荐(4) 推荐, 收藏, 编辑
摘要:验证MVC中提供的模块验证非常灵活,在System.ComponentModel.DataAnnotations命名空间中提供了常用的一些验证特性,如Required、Compare等。 所有的验证特性都提供有ErrorMessage属性给我们设置自定义的出错提示信息,比如我们可以这样指定必填属性的提示:[Required(ErrorMessage ="请输入用户名")]。 还可以通过设置ErrorMessageResourceType和 ErrorMessageResourceName属性来使用系统资源文件实现多语言支持(参考:http://haacked.com/arc 阅读全文

nginx 截断日志一个批处理

2011-02-22 15:34 by 无常, 阅读(937) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:net stop nginxtaskkill /F /IM nginx.exeset "cmdstr=rename logs logs%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%.log"call %cmdstr%set "cmdstr=md logs "call %cmdstr% net start nginx#pause 阅读全文

在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件

2011-02-15 20:33 by 无常, 阅读(1464) 阅读, 推荐(2) 推荐, 收藏, 编辑
摘要:1.在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件。[代码]2.Sqlite除了需要包含System.Data.SQLite.Dll外,再在web.config中加上:[代码] 阅读全文

ASP.NET MVC 2 RTM client side validation一个隐秘的坑

2010-04-11 17:59 by 无常, 阅读(2959) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:同一相站点,有些页面的客户端验证能工作,而有些死活不行。打开页面就出现“Uncaught TypeError: Cannot set property '__MVC_FormValidation' of null”错误,Chrome提示: 确定相关JS已经包含在页面中,(用的是MasterPage,二个页面包含的js文件完全相同),排除了js引用路径不正确的问题。页面上生成... 阅读全文

Python:使用ctypes库调用外部DLL

2010-04-04 23:36 by 无常, 阅读(46711) 阅读, 推荐(8) 推荐, 收藏, 编辑
摘要:昨天天写的一个小程序的总结。在Python中使用ctypes库调用外部C DLL库的函数,涉及到CDLL中在Python和C的数据类型的对应,使用C语言中struct结构体和回调函数的使用。 阅读全文

NHibernate+Oracle 遇到ORA-01461和ORA-01084及解决方法

2010-03-13 20:10 by 无常, 阅读(3134) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:如果使用到Oracle的CLOB字段,那么NHibernate会遇到很诡异的“ORA-01461:仅可以插入LONG列的LONG值赋值”错误。关于此错误的分析和解决方法在这里(http://blog.csdn.net/pojianbing/archive/2008/08/09/2789426.aspx)有详细的介绍,实现NHibernate的自定义类型IUserType接口... 阅读全文

ASP.NET MVC中实现多个按钮提交的几种方法

2010-01-29 02:37 by 无常, 阅读(22490) 阅读, 推荐(11) 推荐, 收藏, 编辑
摘要:有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能。如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点。方法一:使用客户端脚本比如我们在View中这样写:<input type="submit" value="审核通过" onclick='this.form.action="<%=U... 阅读全文

为cnblogs定做一个代码插入代码的windows live writer插件

2010-01-21 18:59 by 无常, 阅读(1407) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:很久没有更新博客了,昨天无意中发现cnblogs页面底部多了二个SyntaxHighlighter的js:shCore.j、shLanguage.js。之前用过几个这方面的插件,但都是把代码格式化好再发布的。既然现在cnblogs已经有了此脚本,何不就近使用。花了二个小时把之前的一个插件修改了一下。源码下载地址:http://code.google.com/p/wlwsh/贴几张效果图。 图1.... 阅读全文

MVC 2.0: ConvertEmptyStringToNull 带来烦恼

2010-01-20 18:34 by 无常, 阅读(2622) 阅读, 推荐(2) 推荐, 收藏, 编辑
摘要:把一个mvc1.0的项目迁移到2.0遇到了些问题,部分表更新时提示某字段值不能为NULL,跟踪发现表单中为没填写的字符串类型字段都为null。下载2.0源码,发现DefaultModelBinder有了不少改动,找到了源头: protected virtual object GetPropertyValue(ControllerContext controllerContext, ModelBin... 阅读全文

Code: jsTree ajax 选择行政区域

2009-12-10 22:47 by 无常, 阅读(1551) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:jsTree是一个jQuery的插件,官网地址:http://www.jstree.com/ DEMO下载/Files/wuchang/JsTree.7z 图1选择效果 图2.选择结果 图3.表数据 阅读全文
点击右上角即可分享
微信分享提示