C# MVC核心基于角色的身份验证参数化
在MVC核心中,下面的代码显示了如何执行基于角色的授权 人力资源部和财务部的人可以访问 如何在不更改源代码的情况下,为使用变量的部署参数化下面的角色? 下周,会计和市场营销将取代这些角色 阅读MSDN文章: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
不是最漂亮的方式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!";
}
}