2011-04-28 92 views
3

我試圖使用自定義屬性來實現授權權限來執行方法。以下是我現在所擁有的(我剛開始的自定義屬性):自定義屬性方法級別授權

[RequiredUserPermissions(UserPermissions.CanLoginViaSite)] 
internal static bool HasDesiredPermissions() 
{ 
    //Execute body here if the attribute decorated permissions exist 
    //for current user tracked as this._user (with permissions as 
    //this._user.UserPermissions (of type UserPermissions (an enum)) 
} 

//Custom attribute class 
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
internal sealed class RequiredUserPermissionsAttribute : Attribute 
{ 
    private readonly UserPermissions _requiredPermission; 

    public RequiredUserPermissionsAttribute(UserPermissions requiredPermission) 
    { this._requiredPermission = requiredPermission; } 

    public UserPermissions RequiredPermissions 
    { get { return _requiredPermission; } } 
} 

,我已經在計算器發現的最接近問題是Using an attribute to prematurely return from a method。如果我使用asp.net mvc框架,答案會非常完美,但不幸的是,我現在正在WCF服務中,並且實現整個授權層,超出了我現在通過WCF方法調用進行的簡單數據庫登錄。從時間軸角度來看,這是可行的。

我相信PostSharp可能是最好的選擇,但再次不是一個現在可行的選項。我在這裏卡住了嗎?我應該回去通過採用枚舉並返回bool的方法來做到這一點。如果能夠讓我通過自定義的attiributes實現這個功能,我很高興能夠學習到詳細/複雜的東西。

任何與我如何可以去這方面的幫助將不勝感激。

回答

2

我不知道它是否可以應用於您的案例,但如果您正在編寫WCF服務,爲什麼不直接從框架使用角色基礎授權?它基於角色或權利要求,對於最簡單的情況,您可以通過屬性來定義它。 角色可以通過Custom Principal定義,也可以簡單地使用框架中定義的標準角色提供者來定義。

[PrincipalPermission(SecurityAction.Demand, Role = 'LoginViaSiteVisitors')] 
internal static bool HasDesiredPermissions() 
{ 
    //.... 
} 
+0

由於現在它的設置方式,通過框架登錄的用戶或者不存在(服務以匿名方式運行)或者不同於實際通過Service.LoginUser登錄的用戶()方法(在這些權限行爲) - 但感謝您的輸入:) – Maverik 2011-04-28 15:41:24

+0

你不能在Service.LoginUser()中定義你的主體,並將其設置爲當前的主體?像'Thread.CurrentPrincipal =新的GenericPrincipal(新的GenericIdentity(用戶,密碼),角色);'?我認爲這可能有效。 – LazyOfT 2011-04-28 15:49:52

+0

嗯,我沒有想到這一點。我現在即將衝出辦公室,但當我週一再回來時,我會盡力讓它變成這樣。我會在回去之後回來。非常感謝這個想法。 – Maverik 2011-04-28 16:33:37