国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ASP.NET WEBAPI 的身份驗證和授權

2019-11-06 06:29:38
字體:
來源:轉載
供稿:網友

身份驗證(Authentication):確定用戶是誰。

授權(Authorization):確定用戶能做什么,不能做什么。

身份驗證

WebApi 假定身份驗證發生在宿主程序稱中。對于 web-hosting,宿主是 IIS。這種情況下使用 HTTP Module 進行驗證。

驗證時,宿主會創建一個表示安全上下文的主體對象(實現 iprincipal),將它附加到當前線程。主體對象包含一個存儲用戶信息的 Identity 對象。若驗證成功,Identity.IsAuthenticated 屬性將返回 true。

HTTP 消息處理程序(HTTP Message Handler)

可以用 HTTP 消息處理程序代替宿主進行身份驗證。這種情況下,由 HTTP 消息處理程序檢查請求并設置主體對象。

請考慮以下事項決定是否使用消息處理程序進行身份驗證:

HTTP 模塊檢查所有經過 asp.net 管道的請求,消息處理程序只檢查路由到 WebAPI的請求。可以為每個路由單獨設置消息處理程序。HTTP 模塊僅在 IIS 中可用。消息處理程序則與宿主無關,在 web-hosting 和 self-hosting 中均可用。HTTP 模塊參與IIS 日志和審計等功能。HTTP模塊在管道之前運行,主體在消息處理程序運行之前不會設置,當響應離開 消息處理程序時,主體會恢復成原來的那個。

一般來說,不需要自承載時,HTTP 模塊較好。

設置主體

進行自定義身份驗證時,應在兩個地方設置主體對象:

Thread.CurrentPRincipal,這是 .net 中設置線程主體的標準方式。HttpContext.Current.User 這是特定于 ASP.NET 的屬性。
private void SetPrincipal(IPrincipal principal){    Thread.CurrentPrincipal = principal;    if (HttpContext.Current != null)    {        HttpContext.Current.User = principal;    }}

采用 web-hosting 時,必須同時設置兩處,避免安全上下文不一致。對于 self-hosting,HttpContext.Current 為 null,所以設置之前應進行檢查。

授權

授權發生在管道中更接近 controller 的位置。

授權篩選器(Authorization filter)在 action 之前運行。若請求未授權,返回錯誤,action 不運行。在 action 內部,可以用 ApiController.User 屬性獲取主體對象,做進一步的控制。

[Authorize]%20屬性

AuthorizeAttribute%20是內置的授權篩選器。用戶未通過身份驗證時,它返回%20HTTP%20401%20狀態碼。可以在全局,控制和%20action%20三個級別應用它。

在全局級別應用:

[Authorize]public%20class%20ValuesController%20:%20ApiController{%20%20%20%20public%20HttpResponseMessage%20Get(int%20id)%20{%20...%20}%20%20%20%20public%20HttpResponseMessage%20Post()%20{%20...%20}}在%20Action%20級別應用:

public class ValuesController : ApiController{    public HttpResponseMessage Get() { ... }        [Authorize]    public HttpResponseMessage Post() { ... }}

復制代碼

在控制器上應用 [Authorize] 時,可以在 Action 上應用 [AllowAnonymous] 取消對某個 Action 的授權要求。上面的代碼可以改成下面的形式:

復制代碼

[Authorize]public class ValuesController : ApiController{    [AllowAnonymous]    public HttpResponseMessage Get() { ... }    public HttpResponseMessage Post() { ... }}

復制代碼

指定用戶和角色進行限制:

復制代碼

// 按用戶限制訪問[Authorize(Users="Alice,Bob")]public class ValuesController : ApiController{}   // 按角色限制訪問[Authorize(Roles="Administrators")]public class ValuesController : ApiController{}

復制代碼

用于 WebAPI 的 AuthorizeAttribute 位于 System.Web.Http 命名空間。在 System.Web.Mvc 命名空間中有一個同名屬性,不可用于 WebAPI。

自定義授權篩選器

可從以下類型派生自定義授權篩選器

AuthorizeAttribute,基于用戶和角色進行授權。AuthorizationFilterAttribute,不基于用戶和角色的同步授權。IAuthorizationFilter,實現此接口執行異步授權邏輯。例如,授權邏輯中有對 IO 或網絡的異步調用。(CPU-bound的授權邏輯更適合從 AuthorizationFilterAttribute 派生,這樣不必寫異步方法)。

下圖是 AuthorizeAttribute 類層次

在%20Action%20中執行驗證

可在控制器中檢查%20ApiController.User%20屬性,根據用戶和角色使用不同的邏輯。

public HttpResponseMessage Get(){    if (User.IsInRole("Administrators"))    {        // ...    }}

復制代碼


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海淀区| 进贤县| 南乐县| 陇西县| 宜阳县| 赞皇县| 新源县| 池州市| 江安县| 澳门| 佛冈县| 舒兰市| 襄汾县| 蒲城县| 铜梁县| 梅河口市| 阿城市| 阳朔县| 山阳县| 呼玛县| 威宁| 尤溪县| 江孜县| 乌拉特前旗| 治县。| 乃东县| 伊宁市| 寻甸| 临桂县| 仪征市| 台州市| 磐安县| 丹凤县| 成武县| 丰台区| 勃利县| 喀喇沁旗| 柳江县| 桐城市| 丰台区| 万宁市|