猿问

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

我已经按照我可以找到的教程和堆栈溢出问题进行操作,但仍然存在一个问题,即我在使用 [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"]失败?


交互式爱情
浏览 236回答 2
2回答

心有法竹

我认为您需要将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

慕的地8271018

回答我自己的问题,因为我发现我做错了什么:如果角色不止一个,则必须以字符串数组的形式提供;如果只有一个,则必须以一个字符串的形式提供。我更新了 json 应用程序设置文件和我的 ApplicationSettings 类,以便 AllowedToMigrate 是一个字符串数组。{  "ApplicationSettings": {    "AllowedToMigrate": [ "ADSecurityGroupOne", "ADSecurityGroupTwo" ]  },  "Logging": {    "IncludeScopes": false,    "LogLevel": {      "Default": "Warning"    }  }}我还修复了角色名称的拼写错误,这是最初的问题!所以这个故事的寓意是:绝对确保您使用正确拼写的角色名称,并在授权似乎无缘无故错误时始终尝试使用不同的角色。
随时随地看视频慕课网APP
我要回答