如何在RIA應用中實現使用者授權

2021-09-06 03:52:34 字數 4036 閱讀 1734

那麼,接著上面這個例子,我們現在有乙個方法如下

[query][requiresauthentication]

///

/// 這個方法返回一些客戶名稱

///

///

public iqueryablegetcustomers()

,new customer(),

new customer(),

new customer(),

new customer()

}.asqueryable();

}

這個方法返回了一些客戶名稱。那麼,假設我們希望這個方法的呼叫者必須在我們的系統裡面具有某個角色,例如sales角色。只有在這個角色裡面的使用者,我們才授權給他呼叫該方法。

接下來我就把這個例子繼續做下去,新增這部分功能。

其實要說起來,要給某個方法進行授權很簡單,我們只需要在方面上面新增乙個attribute即可,請注意看下面紅色的部分

[query][requiresauthentication]/// 

/// 這個方法返回一些客戶名稱

///

///

public iqueryablegetcustomers()

,new customer(),

new customer(),

new customer(),

new customer()

}.asqueryable();

}

我們可以先測試一下,現在執行起來會發生什麼樣的情況?一點都不意外,肯定是要報告錯誤的,因為我們現在的使用者身份沒有關聯到任何的角色。如下圖所示

我們需要在伺服器端實現角色管理,就是要能夠根據使用者身份判斷他所擁有的角色資訊。

為了簡單起見,我新增了乙個******roleprovider,而且只重寫了其中的乙個方法,請注意下面紅色的部分

【備註】這裡只是做例子,重點是給大家講它的原理。所以直接用硬編碼的方式。

public

class ******roleprovider : system.web.security.roleprovider

public

override

set}

public

override

void createrole(string rolename)

public

override

bool deleterole(string rolename, bool throwonpopulatedrole)

public

override

string findusersinrole(string rolename, string usernametomatch)

public

override

string getallroles()

public

override

string getusersinrole(string rolename)

public

override

bool isuserinrole(string username, string rolename)

public

override

void removeusersfromroles(string usernames, string rolenames)

public

override

bool roleexists(string rolename)

}

如何註冊使用這個provider呢?我們需要修改web.config檔案

在system.web裡面新增了這麼一段

<

rolemanager

enabled

="true"

defaultprovider

="******"

>

<

providers

>

<

clear

/>

<

addname

="******"

type

="silverlightriaauthenticationsample.web.******roleprovider"

/>

providers

>

rolemanager

>

再次執行程式,我們會發現已經能返回資料了,為什麼呢,因為chenxizhang這個使用者是sales角色的,所以他就有許可權查詢。

這就是在ria service中進行授權的簡單例子。雖然簡單,但已經能夠說明問題了。

講到這裡,有很多朋友都理解了。但也許有人會對寫這個******roleprovider感到疑惑,為什麼要這麼寫呢?能不能用資料庫裡面的資訊來授權呢?當然是可以的,在真正的系統中,我是推薦你用資料庫來做身份驗證和授權的。

下面有些參考鏈結

簡而言之,其實從asp.net 2.0開始就提供了一套標準的服務來完成身份驗證,授權,個性化,配置等等功能,而且有乙個非常標準的資料庫——傳說中的「aspnetdb」.

有網友之前問到,如何實現更加動態化的授權呢?我是這麼理解的,有兩個層面

這個問題的關鍵在於,如何在方法裡面獲取得到當前使用者的身份。請參考下面這個**。既然能得到使用者的資訊,那麼在查詢的時候,就可以用這個作為引數傳遞到資料庫進行過濾。這樣就實現了剛才所說的需求。

var currentuser = this.servicecontext.user.identity.name;
首先,我可以定義乙個特殊的型別,繼承自authorizationattribute

using system.componentmodel.dataannotations;

using system.configuration;

namespace silverlightriaauthenticationsample.web

///

///

public

string rolenameinconfig

///

/// 這是內部儲存的角色資訊

///

private

string role }}

然後,我在配置檔案中新增乙個設定

<

>

<

addkey

="salesrolename"

value

="sales"

/>

>

接下來,我就可以在方法上面使用這個attribute了

[query][requiresauthentication]

[dynamicrequiresrole(rolenameinconfig="salesrolename")]

///

/// 這個方法返回一些客戶名稱

///

///

public iqueryablegetcustomers()

,new customer(),

new customer(),

new customer(),

new customer()

}.asqueryable();

}

這樣就可以完成特殊的授權了。當然我上面只是乙個演示,你還可以寫更多的邏輯在裡面

【備註】這個**還修正了關於oob中不能正確進行身份驗證的問題

Spring Security 實現使用者授權

上一次,使用spring security與angular實現了使用者認證。spring security and angular 實現使用者認證 本次,我們通過spring security的授權機制,實現使用者授權。實現十分簡單,大家認真聽,都能聽得懂。前台實現了選單的許可權控制,但後台介面還沒...

shiro實現使用者授權

shiro授權在自定義的realm類裡面來實現 public class userrealm extends authorizingrealm 認證 override protected authenticationinfo dogetauthenticationinfo authenticatio...

apache如何在虛擬主機中實現使用者驗證

1,在相應的虛擬主機配置檔案段,加入 allowoverride authconfig authname 自定義的 authtype basic authuserfile data htpasswd 這裡的 data htpasswd你可以隨便寫乙個路徑或名字,沒有限制 require valid ...