iis授权mysql验证_ASP.NET Web API身份验证和授权
本文是作者所理解和翻譯的內(nèi)容。
這篇文章包括兩部分:身份驗(yàn)證和授權(quán)。 身份驗(yàn)證用來確定一個(gè)用戶的身份。例如,Alice用她的用戶名和密碼登陸系統(tǒng),服務(wù)器用她的用戶名和密碼來確定她的身份。
授權(quán)是判斷一個(gè)用戶是否允許執(zhí)行某一操作。例如,Alice有獲取資源的許可,但不能創(chuàng)建資源。
身份驗(yàn)證
Web API有兩種方式進(jìn)行身份驗(yàn)證:在宿主程序中的身份驗(yàn)證和使用 HTTP Message Handlers進(jìn)行身份驗(yàn)證。
如果你的Web API運(yùn)行在IIS中,那么身份驗(yàn)證程序就是HTTP Modules,可以使用內(nèi)置的asp.net身份驗(yàn)證模塊進(jìn)行身份驗(yàn)證,也可以自己寫一個(gè)身份驗(yàn)證模塊完成自定義身份驗(yàn)證。
當(dāng)在宿主程序中進(jìn)行身份驗(yàn)證時(shí),宿主程序會(huì)創(chuàng)建一個(gè)principal對象,這個(gè)對象的類實(shí)現(xiàn)了IPrincipal接口,用來代表當(dāng)前代碼運(yùn)行的安全上下文。宿主通過設(shè)置Thread.CurrentPrincipal 將主體附加到當(dāng)前進(jìn)程。principal包含一個(gè)關(guān)聯(lián)用戶信息的Identity 對象,如果用戶驗(yàn)證通過,Identity.IsAuthenticated 屬性返回true;對于匿名請求,IsAuthenticated 返回false。關(guān)于更多的principals信息,參見Role-Based Security。
使用HTTP Message Handlers 進(jìn)行身份驗(yàn)證
你可以在 HTTP message handler中創(chuàng)建身份驗(yàn)證邏輯來代替使用宿主身份驗(yàn)證機(jī)制,在這種機(jī)制中,message handler檢驗(yàn)Http請求并設(shè)置principal。
該在何時(shí)使用HTTP Message Handler進(jìn)行身份驗(yàn)證呢?這里給出了一個(gè)這種的參考: 一個(gè)HTTP Module觀察所有通過ASP.NET管道的請求;一個(gè)Message Handler只觀察被路由處理的Web API請求。
你可以對每個(gè)路由設(shè)置一個(gè)Message Handler,這個(gè)方便了針對特殊的路由設(shè)置特殊的身份驗(yàn)證方案。
HTTP Module是IIS特有的;Message Handler則與宿主無關(guān),因此你可以同時(shí)在web-hosting和self-hosting中使用。
HTTP Module參與IIS的登陸、審核等處理。
HTTP Module在管道中更早的執(zhí)行,如果你使用Message Handler進(jìn)行身份驗(yàn)證,在handler執(zhí)行前principal 沒有準(zhǔn)備好。此外,在response離開Message Handler后,principal 會(huì)被恢復(fù)到之前的principal 。
綜上所述,如果你不需要支持self-hosting,HTTP Module回事更好的選擇。如果你需要支持self-hosting,那就考慮使用Message Handler吧。
設(shè)置Principal
如果你的程序完成了一些自定義的身份驗(yàn)證邏輯,那么你必須設(shè)置愛兩個(gè)地方的principal: Thread.CurrentPrincipal. 這個(gè)屬性是在.NET中設(shè)置線程 principal的標(biāo)準(zhǔn)途徑。
HttpContext.Current.User. 這個(gè)屬性是ASP.NET 專用的。
下面的代碼展示了如何設(shè)置principal: private voidSetPrincipal(IPrincipalprincipal)
{Thread.CurrentPrincipal = principal;if(HttpContext.Current !=null)
{HttpContext.Current.User = principal;
}
}
對于web-hosting,你必須在這兩個(gè)地方食指principal,否則安全上下文可能會(huì)變得不一致。對于self-hosting,HttpContext.Current是null。為了確定你的代碼與宿主無關(guān),所以在賦值之前檢查一下HttpContext.Current,就像上面的代碼那樣。
授權(quán)
授權(quán)發(fā)生在管道的后面一些,更接近于controller。它讓你在授權(quán)訪問資源是可以進(jìn)行更細(xì)小粒度的操作。
Authorization filters 在controller Action之前運(yùn)行。如果請求未授權(quán),filter返回一個(gè)錯(cuò)誤的response,action不會(huì)被調(diào)用。
在Controller Action內(nèi)部,你可以通過ApiController.User屬性訪問當(dāng)前principal。例如你可能要根據(jù)用戶來過濾一個(gè)資源列表,只返回屬于該用戶的資源。
使用[Authorize]屬性
Web API 提供了一個(gè)內(nèi)置的授權(quán)過濾器:AuthorizeAttribute。這個(gè)過濾器檢查用戶是否被授權(quán),如果沒有,則返回 http status code 401(Unauthorized),不會(huì)調(diào)用Action。
你可以添加將過濾器添加到globally,或Controller級(jí)別,或Action級(jí)別。
globally:要為每一個(gè)Web API請求添加約束,則在全局的過濾器列表中添加AuthorizeAttribute。
public static voidRegister(HttpConfigurationconfig)
{
config.Filters.Add(newAuthorizeAttribute());
}
Controller:要約束一個(gè)特殊的controller的訪問,則在controller上添加AuthorizeAttribute。
[Authorize]public classValuesController:ApiController{publicHttpResponseMessage Get(intid) { ... }publicHttpResponseMessage Post() { ... }
}
Action:要約束一個(gè)特殊Action的訪問,在Action上添加AuthorizeAttribute。
public classValuesController:ApiController{publicHttpResponseMessage Get() { ... }// Require authorization for a specific action.[Authorize]publicHttpResponseMessage Post() { ... }
}
另外,你還可以約束一個(gè)controller訪問的同時(shí)允許匿名訪問特殊的Action,這需要使用[AllowAnonymous]屬性。在下面的示例中,Post方法被約束了,而Get方法允許被匿名訪問:
[Authorize]public classValuesController:ApiController{
[AllowAnonymous]publicHttpResponseMessage Get() { ... }publicHttpResponseMessage Post() { ... }
}
在上面的例子中,過濾器允許任何被驗(yàn)證的用戶訪問受約束的方法,只有匿名用戶被拒絕。
你還可以限制一些特殊用戶或特殊角色的訪問:
// Restrict by user:[Authorize(Users ="Alice,Bob")]public classValuesController:ApiController{
}// Restrict by role:[Authorize(Roles ="Administrators")]public classValuesController:ApiController{
}
注意:Web API中的AuthorizeAttribute過濾器是在命名空間System.Web.Http中的,在MVC Controller中有一個(gè)相似的過濾器,定義在System.Web.Mvc中,他倆不能兼容使用。
自定義 Authorization Filters
一個(gè)自定義authorization filter衍生自一下幾個(gè)類型:
AuthorizeAttribute. 擴(kuò)展這個(gè)類來完成基于當(dāng)前用戶和角色的授權(quán)邏輯。
AuthorizationFilterAttribute. 擴(kuò)展這個(gè)類完成同步的授權(quán)邏輯,這種方式必須要基于當(dāng)前用戶和角色。
IAuthorizationFilter. 實(shí)現(xiàn)這個(gè)接口來完成異步的授權(quán)邏輯。例如,如果你的授權(quán)邏輯使用了異步的IO或網(wǎng)絡(luò)調(diào)用(如果你的授權(quán)邏輯是CPU-Bound,那就和簡單的衍生自AuthorizationFilterAttribute一樣,因?yàn)槟悴恍枰獙懸粋€(gè)異步方法)
The following diagram shows the class hierarchy for the AuthorizeAttribute class.
下面的圖片展示了AuthorizeAttribute的類層級(jí):
在Controller Action中授權(quán)
有時(shí)候,你可能允許一個(gè)請求繼續(xù)下去,但根據(jù)principal改變其行為。例如,你返回的信息會(huì)依賴用戶角色發(fā)生改變。在Controller的方法中,你可以通過ApiController.user屬性得到當(dāng)前的principal。
publicHttpResponseMessage Get()
{if(User.IsInRole("Administrators"))
{// ...}
}
ps. 勉強(qiáng)的翻譯了一下這篇文章的內(nèi)容,就當(dāng)是學(xué)習(xí)的筆記吧。
總結(jié)
以上是生活随笔為你收集整理的iis授权mysql验证_ASP.NET Web API身份验证和授权的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL编程技巧_PHP与MySQL开
- 下一篇: mysql chartset utf 8