Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC核心基于角色的身份验证参数化_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# MVC核心基于角色的身份验证参数化

C# MVC核心基于角色的身份验证参数化,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,在MVC核心中,下面的代码显示了如何执行基于角色的授权 人力资源部和财务部的人可以访问 如何在不更改源代码的情况下,为使用变量的部署参数化下面的角色? 下周,会计和市场营销将取代这些角色 阅读MSDN文章: 不是最漂亮的方式xD 并创建一个静态类,如 public static class SomeClassName { public const string DynamicRoles = "HRManager, Finance"; } 您应该使用策略并编写自己的Authorizati

在MVC核心中,下面的代码显示了如何执行基于角色的授权

人力资源部和财务部的人可以访问

如何在不更改源代码的情况下,为使用变量的部署参数化下面的角色? 下周,会计和市场营销将取代这些角色

阅读MSDN文章:


不是最漂亮的方式xD

并创建一个静态类,如

public static class SomeClassName
{
    public const string DynamicRoles = "HRManager, Finance";
}
您应该使用策略并编写自己的AuthorizationHandler

下面是一个示例,您如何做到这一点:

appsettings.json

startup.cs

授权选项.cs

DynamicRoleHandler.cs


这也是一个设计问题:如果您将角色视为用户组,那么最终会出现这样的情况;随着环境的变化或您将其部署到其他地方,您将需要重新定位授权设置。但是如果你可以有层次化的角色,你就不再需要它了。让我解释一下:您将角色工资设置为SalaryController。在您的角色管理中,只需将“薪资”角色组添加到“人力资源经理”和“财务”组。您可以稍后向这些添加用户。您永远不需要更改代码来更改能够访问函数U=G=F的实际用户。只是永远不要将用户直接添加到薪资组-这会起作用,但会弄乱概念。 如果后面的角色管理中没有组到组的成员身份,则。。。好吧,那你无论如何都应该试着换掉它,因为它不是最好的

如果您的公司环境中有Active Directory,还有什么地方?当角色是广告安全组时,您可能会面临这样一个事实,即有关于如何命名这些组的公司策略。这将因公司而异。要处理这个问题,您仍然应该选择角色名来表示功能,而不是用户组。但是您需要在角色和对应于角色的组之间进行映射。这实际上是在上面的概念之上的一层:U=G=G-F。因此,在您的代码中,您将使用您所使用的功能或角色名称,但在幕后,所有内容都将转换为广告组成员身份。
我已经编写了一个用于处理后一种情况的授权过滤器,如果您需要,我很乐意与您共享它-您已经用asp.net-mvc标记了您的问题。对于asp.net-core@Kahbazi,答案是更多。

创建您自己的授权过滤器,该过滤器源自授权,在实现中,您可以根据自己的意愿设置角色。Hanks,我对这一点不熟悉,几周前在MVC中开始,您能给出授权过滤器的代码示例和实现示例吗?这不起作用,因为现在我必须更改源代码,是否有部署变量?谢谢,我给你的答案更多的是基于在一个地方而不是多个地方进行更改,这样可以节省你的时间。但我如何理解您的问题,您是否希望在部署和运行时,在源代码之外动态地更改它?那是。。。非常危险!我不推荐那个!顺便问一下,你是从哪里学来的?是否有一个资源网站在那里,我想能够研究项目,而无需询问,将在几天内发送点,谢谢!主要是微软的文档。我使用的所有东西都可以在文档中找到,我只是一起使用。顺便问一下,你可以回答我的问题吗?我不确定这是否违反了堆栈溢出规则,但我想知道我是否对赏金提出了质疑,谢谢
[Authorize(Roles = SomeClassName.DynamicRoles)]
public class SalaryController : Controller
{
}
public static class SomeClassName
{
    public const string DynamicRoles = "HRManager, Finance";
}
{
  "Auth": {
    "Role": "User"
  }
}
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .Build();

        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(cfg =>
        {
            cfg.AddPolicy("dynamicRole", b => b.Requirements.Add(new DynamicRole()));
        });

        services.AddScoped<IAuthorizationHandler, DynamicRoleHandler>();
        services.Configure<AuthorizationOptions>(Configuration.GetSection("Auth"));
    }
}
public class DynamicRole : IAuthorizationRequirement
{
}
public class AuthorizationOptions
{
    public string Role { get; set; }
}
public class DynamicRoleHandler : AuthorizationHandler<DynamicRole>
{
    private readonly AuthorizationOptions _options;

    public DynamicRoleHandler(IOptionsMonitor<AuthorizationOptions> options)
    {
        _options = options.CurrentValue;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DynamicRole requirement)
    {
        if (context.User.IsInRole(_options.Role))
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}
public class TestController : Controller
{

    [Authorize(policy: "dynamicRole")]
    public string Test()
    {
        return "Hello World!";
    }
}