无法在授权属性上动态发送 Active Directory 组名

Unable to dynamically send the Active Directory group name on authorize attribute

我想动态分配 Active Directory 组名作为授权过滤器的属性。

目前我们有 2 个 Active Directory 组,一个用于 DEV,另一个用于 Prod。但是,如果我在本地调试时可以访问 dev,我需要访问 action 方法。如果 AD 组是 prod,我不应该访问操作方法。

我尝试在静态中使用常量 class classA

public const  string DevActiveDirectoryName = "DevdirectoryName";
public const  string ProdActiveDirectoryName = "ProddirectoryName";

我的操作方法是这样的:

[Authorize(Roles = ClassA.DevActiveDirectoryName)]
public async task<Iactionresult>GetMemberID()
{
}

上述解决方案的唯一问题是如果我想部署到产品,我需要更改代码并部署它。相反,如果我可以动态地将值传递给可以解决我的问题的属性。我尝试了很多方法。请为这种情况提出最佳解决方案。是否有解决此类问题的方法?感谢您的帮助。

您可以在 web.Config 文件的 <appSettings> 中添加一个条目,并使用 ConfigurationManager 查找应分配给变量 ActiveDirectoryName.[=15= 的值]

<appSettings>
  <add key="ActiveDirectoryName" value="DevdirectoryName" />
  ... // other keys
</appSettings>

并且在您的代码中,您可以查找 web.Config 文件中的内容(Dev 用于开发,Prod 用于生产服务器(部署新代码时不需要部署新的 web.config除非您对其进行更改。

public const string ActiveDirectoryName = ConfigurationManager.AppSettings["ActiveDirectoryName"];

如果您使用的是 Visual Studio,web.config 有两种不同的配置 (web.debug.config / web.release.config)。您可以使用 debug 进行开发,使用 Release 进行生产。

这将保持不变,只有您的配置文件发生变化,

[Authorize(Roles = ClassA.ActiveDirectoryName)]
public async task<Iactionresult>GetMemberID()
{
}

为了能够更改不同环境的组名,您需要使用配置设置而不是常量。关于如何为 ASP.NET 核心应用程序提供配置设置,有很多选项。 link 给出了概述。

如果您的应用程序使用默认主机生成器,它将从各种来源读取配置设置,例如appsettings.json。您可以在此文件中添加设置(如果尚不存在,请将其添加到项目中),例如:

{
  "ADGroupName": "ProddirectoryName"
}

对于您的开发环境,有一个专用文件 appsettings.dev.json 可用于保存您的开发设置:

{
  "ADGroupName": "DevdirectoryName"
}

当使用 Authorize 属性保护控制器时,您需要为构造函数提供一个常量值。由于以后可以更改配置设置,因此(显然)不是恒定的。

因此,您必须在 Startup.cs 中的 ConfigureServices 方法中设置一个具有常量名称的策略:

var adGroupName = Configuration.GetValue<string>("ADGroupName");

services.AddAuthorization(options =>
{
    options.AddPolicy("ADGroupPolicy", policy =>
    {
        // This requirement checks for the group
        policy.RequireRole(adGroupName);
    });
});

对于controller,需要在Authorize属性中添加策略名称:

[Authorize("ADGroupPolicy")]
public async task<Iactionresult>GetMemberID()
{
}