.NET Core 2.1 Windows身份验证无法识别角色成员身份

时间:2018-08-15 14:12:22

标签: c# .net iis-express core

我已经遵循了教程和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"]为什么会失败?

2 个答案:

答案 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"
    }
  }
}

我还修复了角色名称的错字,这是原来的问题!因此,这个故事的寓意是:绝对确保使用正确拼写的角色名称,并在无缘无故的授权错误时始终尝试使用其他角色。