2014-04-10 47 views
0

在C#ASP.NET MVC 4網站上工作時遇到以下問題。C#授權從變量設置角色

在我的代碼調用該函數授權,像這樣:

private const string GROUP = "Administrators"; //The group that users have to apply to 

[Authorize(Roles = GROUP)] 
     private string GenerateToken() 
     { 
      ... 
     } 

但現在這個網站將被部署於多個位置和常量字符串集團已被設置過其他值。在這個例子中,您只需更改值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; 

回答

0

不能直接回答你的問題,但我具有角色的兩個「層次」解決這個問題:

  • 較低級別表示對資源的保護,並且是細粒度和應用程序特定的我知道了。在你的情況下,角色可能是「CanGenerateToken」。用戶從不直接擔任這些角色的成員。

  • 上層代表用戶組(在企業中,這些通常是業務角色)。在這裏你可能擁有諸如「MyAppAdministrators」之類的角色。這些角色是細粒度較低級別角色的成員(例如,「MyAppAdministrators」是「CanGenerateToken」的成員)。

不幸的是,標準的ASP.NET RoleProvider不支持這種方式的多級角色(除了使用Windows組作爲角色時)。我已經實現了一個自定義的RoleProvider,它擁有自己的管理UI。

通過這種方法,你的代碼包含基於較低級別的硬連線授權,細粒度的角色很少變化:

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

但管理員可以靈活地映射更高級別的「用戶組「角色扮演這個角色。