在asp.net WebAPI 中 使用Forms認證和ModelValidata(模型驗證)

來源:互聯網
上載者:User

標籤:

一、Forms認證1、在webapi項目中啟用Forms認證

Why:為什麼要在WebAPI中使用Forms認證?因為其它項目使用的是Forms認證。

What:什麼是Forms認證?它在WebAPI中就是一個MessageHandle,具體請尋找關鍵字“ASP.NET Forms”

How:如何啟動Forms認證?

  最簡單的是通過配置啟動Forms認證:

1 <system.web>2     <authentication mode="Forms">3       <forms name=".FormsCookie" loginUrl="/login.aspx" protection="All" timeout="43200" path="/" defaultUrl="http://www.cnblogs.com" domain=".cnblogs.com" cookieless="UseCookies" />4     </authentication>5     <httpCookies httpOnlyCookies="true" />6   </system.web>7   <system.webServer>
View Code

  簡單說說Forms認證的工作原理:首先在管道中,Forms讀取請求中的相關的cookie,解密,進行認證,並把認證的結果寫到請求上下文和線程的Identity屬性中。然後請求繼續往後面走,最終產生的響應在管道中返回時,Forms會判斷如果響應為401,那麼就location到配置中的loginUrl設定的地址,並改變status為302。

2、幾個Attribute

Why:為什麼要認識Attribute?因為Forms認證的結果是寫到Identity屬性中,一般我們要擷取該屬性,判斷是否認證成功,如果失敗返回401,等等進行很多處理。是不是很麻煩?對,封裝起來,自己寫一個嗎?當然可以,其實微軟大法早就考慮好了,針對一般的情境的處理邏輯都封裝好了,他們分別叫做

AuthorizeAttribute、AllowAnonymousAttribute,都是Attribute。

What:這些Attribute是什嗎?顧名思義,AuthorizeAttribute只允許認證通過的請求,AllowAnonymousAttribute允許匿名請求。

How:那麼該怎麼用呢?很簡單他們可以作用類型、方法上,所以可以全域註冊、controller、action, so easy!

 

3、重寫unauthorize中驗證失敗方法

Why:因為如果response status == 401,那麼Forms會location到配置中的loginUrl,(即使沒有手動設定它,也會產生一個預設值“login.aspx”),並且設定status為302。如果用戶端是瀏覽器的話,那麼就會直接進行跳轉而無法捕獲這個狀態,這在很多情境下不合適,例如:spa(單頁應用)中,我們不希望它自動跳轉到登陸頁面,而是給出提示,讓使用者自己選擇是否登入。所以要重寫Forms中身分識別驗證失敗的處理邏輯。

How:在AuthorizationFilterAttribute中有個虛方法HandleUnauthorizedRequest,重寫它來實現自訂的處理邏輯。這樣的設計思路挺不錯,可以多借鑒。

    /// <summary>    /// If unauthorize return 403 instead of  401, avoid redirect.    /// </summary>    public class ForbiddenLocationAuthorizeAttribute : AuthorizeAttribute    {        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)        {            HttpResponseMessage response = new HttpResponseMessage();            response.StatusCode = System.Net.HttpStatusCode.Forbidden;            actionContext.Response = response;        }    }

使用403(Forbidden)來代替401,這樣就可以避免Forms的自動跳轉了。雖然這樣做有些弊端,但這也不失為一個有效解決辦法。

二、ModelValidata(模型驗證)

1、Why

  凡是有使用者輸入的地方都少不了參數驗證,這不光是個安全問題,也是為了保證資料完整正確。

2、What

  WebAPI整合了模型驗證機制,當請求被action執行之前,有一個模型繫結的步驟,它就是匹配action的參數,具體細節就不說了,ModelValidata就是在這裡進行,它會根據Model中各個屬性的DataAnnotations(資料註解)來進行驗證,最終把結果儲存在action的內容相關的一個屬性中,即actionContext.ModelState.IsValid。

3、How

  a、為Model設定DataAnnotations

  

public class BannerDto    {        [JsonProperty(PropertyName = "id")]        [Required(ErrorMessage = "Id是必須的")]        public Guid Id { get; set; }        [JsonProperty(PropertyName = "title")]        [Required(ErrorMessage = "標題不可為空")]        [MaxLength(200, ErrorMessage = "標題不能超過200個字元")]        public string Title { get; set; }        [JsonProperty(PropertyName = "src")]        [Required(ErrorMessage = "圖片連結不可為空")]        [MaxLength(500, ErrorMessage = "圖片連結不能超過500個字元")]        public string ImageUri { get; set; }        [JsonProperty(PropertyName = "href")]        [Required(ErrorMessage = "超連結不可為空")]        [MaxLength(500, ErrorMessage = "超連結不能超過500個字元")]        public string Href { get; set; }        [JsonIgnore]        public Guid? AuthorityId { get; set; }        [JsonIgnore]        public bool IsDeleted { get; set; } = false;        [JsonProperty(PropertyName ="createDate")]        public DateTime CreateDate { get; set; }    }

  ps:[JsonProperty]、[JsonIgnore]是指定Json序列化的一些相關設定,設定別名、忽略等等。返回優雅的變數的名稱,保證代碼風格。

  DataAnnotations的使用,請查看msdn,太簡單了。設定好約束條件和ErrorMessage,當驗證失敗了,就會返回ErrorMessage。

  b、使用Filter方式,為Action添加驗證,好處就不多說了。

public class ValidataModelAttribute : ActionFilterAttribute    {        public override void OnActionExecuting(HttpActionContext actionContext)        {            if (!actionContext.ModelState.IsValid)            {                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);            }        }    }

別忘了在HttpComfiguration中注入這個Filter

            //模型驗證            config.Filters.Add(new ValidataModelAttribute());    

對於不希望不驗證的Action可以使用OverrideActionFilters重寫上級設定的所有Fiters。

ModelValidate失敗的請求會得到400的響應,同時所有ErrorMessage都會在響應報文中,例如:

{"Message":"The request is invalid.","ModelState":{"sub.Href":["超連結不可為空白"]}}

 

在asp.net WebAPI 中 使用Forms認證和ModelValidata(模型驗證)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.