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

C# 无法在“授权”属性上动态发送Active Directory组名,c#,asp.net-mvc,asp.net-core,asp.net-mvc-4,.net-core,C#,Asp.net Mvc,Asp.net Core,Asp.net Mvc 4,.net Core,我想动态分配Active Directory组名作为授权筛选器的属性 目前,我们有两个Active Directory组,一个用于DEV,另一个用于Prod。但是,如果我在本地调试时可以访问DEV,我需要访问action方法。如果广告组是prod,我就没有访问action方法的权限 我尝试在静态类classA中使用常量 public const string DevActiveDirectoryName = "DevdirectoryName"; public const

我想动态分配Active Directory组名作为授权筛选器的属性

目前,我们有两个Active Directory组,一个用于DEV,另一个用于Prod。但是,如果我在本地调试时可以访问DEV,我需要访问action方法。如果广告组是prod,我就没有访问action方法的权限

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

public const  string DevActiveDirectoryName = "DevdirectoryName";
public const  string ProdActiveDirectoryName = "ProddirectoryName";
我的行动方法是这样的:

[Authorize(Roles = ClassA.DevActiveDirectoryName)]
public async task<Iactionresult>GetMemberID()
{
}
[授权(角色=ClassA.DevActiveDirectoryName)]
公共异步taskGetMemberID()
{
}

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

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

<appSettings>
  <add key="ActiveDirectoryName" value="DevdirectoryName" />
  ... // other keys
</appSettings>
如果您使用的是Visual Studio,则web.config有两种不同的配置(web.debug.config/web.release.config)。您可以使用debug进行开发和发布,以在生产环境中工作

这将保持不变,仅更改您的配置文件

[Authorize(Roles = ClassA.ActiveDirectoryName)]
public async task<Iactionresult>GetMemberID()
{
}
[授权(角色=ClassA.ActiveDirectoryName)]
公共异步taskGetMemberID()
{
}

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

<appSettings>
  <add key="ActiveDirectoryName" value="DevdirectoryName" />
  ... // other keys
</appSettings>
如果您使用的是Visual Studio,则web.config有两种不同的配置(web.debug.config/web.release.config)。您可以使用debug进行开发和发布,以在生产环境中工作

这将保持不变,仅更改您的配置文件

[Authorize(Roles = ClassA.ActiveDirectoryName)]
public async task<Iactionresult>GetMemberID()
{
}
[授权(角色=ClassA.ActiveDirectoryName)]
公共异步taskGetMemberID()
{
}

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

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

对于您的开发环境,有一个专用文件
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);
    });
});

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

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

对于您的开发环境,有一个专用文件
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);
    });
});

您好Jawad-我感谢您的回复,但这是.NETCore2.1中的实现。我不认为web.config可以使用。还有其他想法吗?在.net core的appsettings.json上。使用配置文件作为值的相同想法。对于.net 2.1Hi Jawad,我感谢您的回复,但这是在.net core 2.1中实现的。我不认为web.config可以使用。还有其他想法吗?在.net core的appsettings.json上。使用配置文件作为值的相同想法。对于.net 2.1 Excellent。这就是我所看到的简短而简单的实现。谢谢你,先生!杰出的这就是我所看到的简短而简单的实现。谢谢你,先生!