美文网首页.NET
.netcore升级遇到的一个小问题

.netcore升级遇到的一个小问题

作者: 转交遇见陈绮贞 | 来源:发表于2017-04-03 14:36 被阅读118次

    一般我们在Action加[Authorize(Policy="XXX")]来授权用户是否有权限访问该Action,同时程序启动时也要配置上相应的XXXPolicy,否则程序启动后没有做配置的授权不会生效。我们的项目的授权都是一开始配置在数据库中,程序启动时全部加载进来进行配置。周二项目上线时,由于我没有将新加入的权限配置加入正式库中,部署后的项目启动时挂了,幸好有阿里云的日志记录提示出是没有配置相应的权限的问题。加上后重新部署后就好了。

    虽然只是一个小问题,也很快解决了。但是让我疑惑的时,为什么项目无法启动,在我的记忆中,没有进行授权的配置也就是对应授权不生效,不访问时并不会报错。最近项目迁移到了linux并升级到了1.1.0,我就想会不会是升级项目出的问题。

    从github上clone下mvc源码,先切换到rel/1.1.0分支,在samples里面的测试项目的HomeController加一个About Action,并加上 [Authorize(Policy ="韩策")]权限,运行果然报错。

    Alt text

    切换分支到rel/1.0.3分支,相同的测试并未报错。

    查看mvc1.1.0的源码可以发现程序添加mvc时会执行这样一段代码

    foreach (var actionModel in controllerModel.Actions)
    {
        var actionModelAuthData = actionModel.Attributes.OfType<IAuthorizeData>().ToArray();
        if (actionModelAuthData.Length > 0)
        {
            actionModel.Filters.Add(GetFilter(_policyProvider, actionModelAuthData));
        }
    
        foreach (var attribute in actionModel.Attributes.OfType<IAllowAnonymous>())
        {
            actionModel.Filters.Add(new AllowAnonymousFilter());
        }
    }
    
    public static AuthorizeFilter GetFilter(IAuthorizationPolicyProvider policyProvider, IEnumerable<IAuthorizeData> authData)
    {
        // The default policy provider will make the same policy for given input, so make it only once.
        // This will always execute syncronously.
        if (policyProvider.GetType() == typeof(DefaultAuthorizationPolicyProvider))
        {
            var policy = AuthorizationPolicy.CombineAsync(policyProvider, authData).GetAwaiter().GetResult();
            return new AuthorizeFilter(policy);
        }
        else
        {
            return new AuthorizeFilter(policyProvider, authData);
        }
    }
    

    这个段代码会检查你所有Action上的Authorize是否都有对应的配置,如果没有则会报错,同理Controller也是如此。而1.0.3版本中添加nvc则没有做检查。

    .net core的开源使我更加有动力学习了。

    相关文章

      网友评论

        本文标题:.netcore升级遇到的一个小问题

        本文链接:https://www.haomeiwen.com/subject/iaxoottx.html