无法在授权属性上动态发送 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()
{
}
我想动态分配 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()
{
}