我已经遵循了教程和StackOverflow的问题,但是仍然遇到问题,在使用[Authorize]属性修饰的方法上,我得到了403 Forbidden。
这是一种有效的方法,可证明Google Chrome浏览器在调试过程中将Windows凭据传递给了在IISExpress中运行的网站。
public IActionResult Index()
{
ViewBag.UserIdentityIsAuthenticated = User.Identity.IsAuthenticated;
ViewBag.UserIdentityName = User.Identity.Name;
ViewBag.UserIsInRoleTechnical = User.IsInRole("ADSecurityGroupOne");
ViewBag.UserIsInRoleTechnicalPeople = User.IsInRole("ADSecurityGroupOneTwo");
return View();
}
这是一个失败的方法,但403只能显示视图,尚未链接到任何数据库。
[Authorize(Policy = "AllowedOnly")]
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index(AccountViewModel model)
{
if (ModelState.IsValid)
{
return View();
}
else
return View();
}
这是Startup.cs中的ConfigureServices方法
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOptions();
ApplicationSettings appSettings = new ApplicationSettings();
Configuration.GetSection("ApplicationSettings").Bind(appSettings);
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization(options => options.AddPolicy("AllowedOnly", policy => policy.RequireRole(appSettings.AllowedToMigrate)));
}
我已经确认AllowedToMigrate的值与appsettings.json中指定的值相同。
{
"ApplicationSettings": {
"AllowedToMigrate": "ADSecurityGroupOne,ADSecurityGroupTwo"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
[Authorize(Policy = "AllowedOnly"]
为什么会失败?
答案 0 :(得分:1)
我认为您需要将AllowedToMigrate
值拆分为组件角色,而不仅仅是将其提交为一个字符串。
您真正想要实现的是
services.AddAuthorization(options => options.AddPolicy("AllowedOnly",
policy => policy.RequireRole("ADSecurityGroupOne", "ADSecurityGroupTwo")));
我不太确定您是如何通过单个配置设置完成此操作的-可能是通过创建新要求来实现的:
https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.1
答案 1 :(得分:0)
回答自己的问题,因为我发现自己做错了什么:
如果角色不止一个,则必须以字符串数组的形式提供;如果只有一个,则仅以单个字符串的形式提供。我更新了json应用程序设置文件和ApplicationSettings类,以便AllowedToMigrate是一个字符串数组。
{
"ApplicationSettings": {
"AllowedToMigrate": [ "ADSecurityGroupOne", "ADSecurityGroupTwo" ]
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
我还修复了角色名称的错字,这是原来的问题!因此,这个故事的寓意是:绝对确保使用正确拼写的角色名称,并在无缘无故的授权错误时始终尝试使用其他角色。