我目前在一个操作方法中使用以下属性修饰符。
[Authorize(Roles = "Admin")]
public ActionResult DoAdminTask()
{
//Do something
return View();
}
目前只有管理员角色的用户可以调用此方法,但这将会改变。我是否可以将授权角色列表存储在配置文件中,而不是硬编码到源代码中?
编辑:角色将随时间改变,并且需要访问超过1个角色。 即,无论是A角色还是B角色的用户都可以访问。
我目前在一个操作方法中使用以下属性修饰符。
[Authorize(Roles = "Admin")]
public ActionResult DoAdminTask()
{
//Do something
return View();
}
目前只有管理员角色的用户可以调用此方法,但这将会改变。我是否可以将授权角色列表存储在配置文件中,而不是硬编码到源代码中?
编辑:角色将随时间改变,并且需要访问超过1个角色。 即,无论是A角色还是B角色的用户都可以访问。
使用标准授权属性无法完成此操作,但是您可以使用自己的自定义授权属性扩展授权属性,并使其使用配置文件来确定控制器/操作与角色集之间的映射。
我觉得这个问题值得用一个代码示例来回答...借鉴了@tvanfosson的建议,我想出了以下这个方案(欢迎批评)。
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
文件的任何更改生效。public static class AppRoles
{
public const string Users = "UsersRoleName";
public const string Admin = "AdminRoleName";
}
然后控制器可以具有授权属性
[Authorize(Roles = AppRoles.Admin)]