我目前有以下属性装饰其中一个动作方法。
[Authorize(Roles = "Admin")]
public ActionResult DoAdminTask()
{
//Do something
return View();
}
目前,只有Admin角色的用户才能调用此方法,但这会发生变化。无论如何,我可以在配置文件中存储授权角色列表,而不是将其硬编码到源代码中吗?
编辑:角色会随着时间的推移而发生变化,超过1个角色需要访问权限。 即角色A OR 角色B可以访问的用户。
答案 0 :(得分:5)
无法使用标准authorize属性执行此操作,但您可以使用自己的自定义authorize属性扩展authorize属性,并让它使用配置文件来确定控制器/操作与角色集之间的映射。
答案 1 :(得分:0)
但您可以使用类似
的内容public static class AppRoles
{
public const string Users = "UsersRoleName";
public const string Admin = "AdminRoleName";
}
然后Controller可以将授权属性设为
[Authorize(Roles = AppRoles.Admin)]
答案 2 :(得分:0)
我觉得这个问题应该得到一个代码示例的答案......考虑@tvanfosson关于扩展AuthorizeAttribute
课程的建议,这是我提出的(批评非常受欢迎)。
<强> AuthorizeFromConfiguration.cs 强>:
public class AuthorizeFromConfiguration: AuthorizeAttribute
{
public new string Roles
{
get {
return base.Roles;
}
set {
var config = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("authorization.json")
.Build();
base.Roles = config[value];
}
}
}
<强> authorization.json 强>:
{
"Parts": {
"Create": "contoso.com\\MyWebApp_CreateNewPart",
"Edit": "contoso.com\\MyWebApp_EditPart"
}
}
使用示例:
[AuthorizeFromConfiguration(Roles = "Parts:Create")]
public class CreateModel : PageModel
{
//...
}
注意:在我的测试中,在authorization.json
文件的任何更改生效之前,必须重新启动网站,即使我尝试更改逻辑以便在{{1}上读取JSON文件访问者而不是get
。