C#从变量授权设置角色

时间:2014-04-10 08:55:18

标签: c# asp.net xml asp.net-mvc authorization

在使用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()
        {
            ...
        }

但是现在这个网站将被部署到多个位置,而const字符串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;

1 个答案:

答案 0 :(得分:0)

没有直接回答你的问题,但我通过两个"等级来解决这个问题。角色:

  • 较低级别表示对资源的保护,并且是细粒度和特定于应用程序的。在您的情况下,角色可能是" CanGenerateToken"。用户永远不会直接成为这些角色的成员。

  • 上层代表用户组(在企业中,这些用户通常是业务角色)。在这里,您可能拥有" MyAppAdministrators"等角色。这些角色是细粒度的低级角色的成员(例如" MyAppAdministrators"是" CanGenerateToken&#34的成员;)。

不幸的是,标准的ASP.NET RoleProvider不会以这种方式支持多个级别的角色(除非使用Windows组作为角色)。我已经实现了一个自定义的RoleProvider,它具有自己的管理UI。

使用这种方法,您的代码包含基于较低级别,细粒度角色的硬连线授权,这些角色很少发生变化:

[Authorize(Roles="CanGenerateToken")]
public void GenerateToken()
{
    ...
}

但是管理员可以灵活地映射更高级别的用户组"角色扮演这个角色。