一般我们在Action加[Authorize(Policy="XXX")]来授权用户是否有权限访问该Action,同时程序启动时也要配置上相应的XXXPolicy,否则程序启动后没有做配置的授权不会生效。我们的项目的授权都是一开始配置在数据库中,程序启动时全部加载进来进行配置。周二项目上线时,由于我没有将新加入的权限配置加入正式库中,部署后的项目启动时挂了,幸好有阿里云的日志记录提示出是没有配置相应的权限的问题。加上后重新部署后就好了。
虽然只是一个小问题,也很快解决了。但是让我疑惑的时,为什么项目无法启动,在我的记忆中,没有进行授权的配置也就是对应授权不生效,不访问时并不会报错。最近项目迁移到了linux并升级到了1.1.0,我就想会不会是升级项目出的问题。
从github上clone下mvc源码,先切换到rel/1.1.0分支,在samples里面的测试项目的HomeController加一个About Action,并加上 [Authorize(Policy ="韩策")]
权限,运行果然报错。
切换分支到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的开源使我更加有动力学习了。