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

一般我们在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().ToArray();
    if (actionModelAuthData.Length > 0)
    {
        actionModel.Filters.Add(GetFilter(_policyProvider, actionModelAuthData));
    }

    foreach (var attribute in actionModel.Attributes.OfType())
    {
        actionModel.Filters.Add(new AllowAnonymousFilter());
    }
}

public static AuthorizeFilter GetFilter(IAuthorizationPolicyProvider policyProvider, IEnumerable 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升级遇到的一个小问题)