C#授权从变量中设置角色
本文关键字:设置 角色 变量 授权 | 更新日期: 2023-09-27 17:57:39
在C#ASP上工作时。NET MVC 4网站我遇到了以下问题。
在我的代码中,我这样调用Authorize函数:
private const string GROUP = "Administrators"; //The group that users have to apply to
[Authorize(Roles = GROUP)]
private string GenerateToken()
{
...
}
但现在这个网站将被部署到多个位置,并且常量字符串GROUP必须设置太多其他值。在本例中,您只需更改值Administrators。但我不希望其他用户打开代码文件,然后碰运气。
因此,我创建了一个xml解析器,并从设置xml中解析这个值。但是我如何从一个变量中设置一个常数呢。这是不可能的,因为常数就是常数。但是有办法吗?
如何解析xml:
public class Settings
{
public string UserGroup { get; set; }
public Settings(String Loc)
{
Initialize(Loc);
}
private void Initialize(String Loc)
{
using (XmlReader reader = XmlReader.Create(new StringReader(GetXMLAsString(Loc))))
{
reader.ReadToFollowing("UserGroup");
UserGroup = reader.ReadElementContentAsString();
}
}
public string GetXMLAsString(String Loc)
{
XmlDocument doc = new XmlDocument();
doc.Load(Loc);
StringWriter sw = new StringWriter();
XmlTextWriter tx = new XmlTextWriter(sw);
doc.WriteTo(tx);
return sw.ToString();
}
这是否可能实现:
private const string GROUP = settings.UserGroup;
不是直接回答您的问题,但我通过拥有两个"级别"的角色来解决这个问题:
-
较低的级别表示对资源的保护,并且是细粒度的和特定于应用程序的。在您的情况下,角色可能是"CanGenerateToken"。用户从来都不是这些角色的直接成员。
-
上层代表用户组(在企业中,这些用户通常是业务角色)。在这里,您可能拥有诸如"MyAppAdministrators"之类的角色。这些角色是细粒度较低级别角色的成员(例如,"MyAppAdministrators"是"CanGenerateToken"的成员)。
不幸的是,标准ASP。NET角色提供程序不支持这种方式的多级角色(使用Windows组作为角色时除外)。我已经实现了一个自定义的RoleProvider,它有自己的管理UI。
使用这种方法,您的代码包含基于较低级别、细粒度角色的硬连接授权,这些角色很少更改:
[Authorize(Roles="CanGenerateToken")]
public void GenerateToken()
{
...
}
但是管理员可以灵活地将更高级别的"用户组"角色映射到此角色。