2012-09-14 15 views
2

這是我的第一個請求,所以不要太難。 :)在沒有MVC的情況下針對數據庫構建ASP.Net自定義授權

我們正在構建一個Sharepoint 2010 - 應用程序,它由一些Sharepoint Web部件和許多ASP.Net站點組成。因此我們僅限於使用沒有MVC的ASP.Net。做出這個決定並且不能被拒絕。

我們使用Windows身份驗證和模擬。用戶存儲在應用程序數據庫中。與用戶一起,角色具有對特定對象和特定動作的權利。所有這些信息都存儲在自定義數據庫中。

該數據庫有一個數據訪問層(EF 4.0)。由於Sharepoint僅限於.NET Framework 3.5,因此業務邏輯由一個WCF數據服務組成,該服務使用DAL和業務邏輯庫來訪問WCF數據服務以獲取所需的信息。

ASP.Net-Pages和Sharepoint Web部件直接訪問業務邏輯。

我現在需要的是某種管理員類,它正在檢查用戶對數據庫授權他訪問特定對象。我不想以編程方式進行。我想使用註釋來指定是否可以調用業務層中的方法。此外,我想隱藏ASP.Net站點中的一些內容,而沒有編程性的if-子句。

有人可以給我一個提示,以實現這一目標嗎?有沒有辦法自定義標準框架的一部分來實現它?

用戶和他想要存儲在會話中的角色和權限。這是一個好方法嗎?該應用程序只能在本地網絡中訪問。

回答

0

歡迎來到計算器!在這幾個想法 -

  1. 您可能更適合在表姐網站http://sharepoint.stackexchange.com問這些問題。

  2. 這取決於您的網絡農場架構。如果您的Web前端和數據源位於同一臺服務器上,那麼使用Windows身份驗證來確定當前用戶應該很簡單。但是,如果您的Web前端和數據源位於不同的服務器上,那麼由於「雙跳」方案,您已經達到了一個限制,在這種情況下,用戶的憑據無法共享到SharePoint服務器後面的服務器 - 可以這麼說。
    要解決,調查在SharePoint環境中,允許的SharePoint在整個農場跟蹤用戶憑證使用Kerberos身份驗證 - http://blogs.technet.com/b/tothesharepoint/archive/2010/07/22/whitepaper-configuring-kerberos-authentication-for-sharepoint-2010-and-sql-server-2008-r2-products.aspx

  3. 另一種替代方案,不要使用SharePoint作爲應用程序的主機。創建您的Web應用程序並將其部署爲其自己的網站(http://mysupercoolsite.organization.com),並在SharePoint中創建一個新的「Web部件頁面」,並使用「整頁垂直」佈局。然後,在頁面中添加一個「頁面查看器」Web部件,將該URL提供給mysupercoolsite.organization.com。通過這種方式,SharePoint是您的用戶對此應用程序的「門戶」,但所有身份驗證,授權和結構都基於應用程序本身,而不是SharePoint。

+0

作爲#3的一個旁註,這意味着如果你願意,你可以在MVC中編寫站點。 –

+0

謝謝你的迴應。我忘了查找。我的方法在底部。 – Rukh

0

我們作爲應用程序主機住在sharepoint。

我已經實現了一個實現所有安全問題的自定義用戶控件。

public partial class FMD_RoleEnabledControl : System.Web.UI.UserControl 
{ 
    public string EnabledRoles { get; set; } 
    public bool HasDataBinding { get; set; } 


    public string CurrentUserName 
    { 
     get { return Page.User.Identity.Name; } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     if (!HasDataBinding) 
      Visible = EnabledRoles.Split(',').Any(rolle => new FMDRoleProvider().IsUserInRole(CurrentUserName, rolle)); 
     base.OnPreRender(e); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     if(HasDataBinding) 
      Visible = EnabledRoles.Split(',').Any(rolle => new FMDRoleProvider().IsUserInRole(CurrentUserName, rolle)); 
     base.OnLoad(e); 
    } 
} 

定製RoleProvider

public class FMDRoleProvider : RoleProvider 
{ 
    public const string SEPERATOR = ","; 

    ... 

    public override string[] GetRolesForUser(string username) 
    { 
     if (username == null || username == "") 
      throw new ProviderException("Kein User-Name übergeben"); //TODO 

     string tmpRollen = ""; 

     RechteManager rm = new RechteManager(); 
     var rollen = rm.GetUserRollen(username); 
     foreach (var rolle in rollen) 
     { 
      tmpRollen += rolle.ROL_Name + SEPERATOR; 
     } 

     if (tmpRollen.Length > 0) 
     { 
      //Letzten seperator entfernen 
      tmpRollen = tmpRollen.Substring(0, tmpRollen.Length - 1); 
      return tmpRollen.Split(','); 
     } 

     return new string[0]; 
    } 

    ... 

    public override bool IsUserInRole(string userName, string roleName) 
    { 
     if (userName == null || userName == "") 
      throw new ProviderException("User name cannot be empty or null."); //TODO 
     if (roleName == null || roleName == "") 
      throw new ProviderException("Role name cannot be empty or null."); //TODO 

     RechteManager rm = new RechteManager(); 
     return rm.IsUserInRolle(userName, roleName); 
    } 
} 

使用

public partial class CustomControl: FMD_RoleEnabledControl 

<custom:CustomControl ID="custom" runat="server" EnabledRoles="Admin" HasDataBinding="True" /> 

它只有第一種方式要檢查的角色,但它工作得很好。作爲第二個目標,我將實施額外的安全措施,比如檢查speficic動作。此外,RoleProvider必須在web.config中註冊。但時間很短;)

相關問題