آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

اعتبار سنجی Model در Asp.Net Web API

دوره های مرتبط با این مقاله

اعتبار سنجی Model در Asp.Net Web API

بعضی اوقات شما می خواهید وقتی کاربر اطلاعاتی به Web API شما ارسال می کند آن اطلاعات را قبل از هرگونه پردازشی اعتبارسنجی کنید. این مقاله به شما نشان می دهد چگونه از annotation ها برای اعتبارسنجی داده ها استفاده کنیم و خطاهای اعتبارسنجی در Web API را مدیریت کنید.

Data Annotation ها

در Asp.Net Web API شما می توانید attribute ها را از System.ComponentModel.DataAnnotationsبرای تنظیم قوانین اعتبارسنجی برای خاصیت ها در model خود استفاده کنید. Model زیر را در نظر بگیرید:

using System.ComponentModel.DataAnnotations;
namespace MyApi.Models
{
   public class Product
   {
       public int Id { get;set;}
       [Required]
       public string Name { get;set;}
       public decimal Price { get;set;}
       [Range(0, 999)]
       public double Weight { get;set;}
   }
}

attribute Required مشخص می کند که خاصیت name نباید null باشد. attribute Range مشخص می کند Weight باید بازه ای بین صفر و 999 باشد. فرض کنید که کاربر یک درخواست POST با JSON زیر ارسال کند:

{ Id":4, "Price":2.99, "Weight":5" }

همانطور که می بینید با اینکه مقدار Name به صورت required مشخص شده بود، خاصیت Name خالی می باشد. هر گاه Web API ، JSON را به یک مورد Product تبدیل می کند باعث می شود اعتبارسنجی product خلاف attribute های اعتبارسنجی صورت گیرد. در action کنترولر، شما می توانید صحت اعتبار model را آزمایش کنید:

using MyApi.Models;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace MyApi.Controllers
{
   public class ProductsController : ApiController
   {
       public HttpResponseMessage Post(Product product)
       {
           if (ModelState.IsValid)
           {
               // Do something with the product (not shown).
               return new HttpResponseMessage(HttpStatusCode.OK);
           }
           else
           {
               return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
           }
       }
   }
}

اعتبارسنجی model هیچ تضمینی برای امن نگه داشتن داده کاربر نمی دهد. ممکن است در لایه های دیگر برنامه، اعتبارسنجی اضافی نیاز باشد.(برای مثال، لایه داده باعث اعمال محدودیت کلید خارجی می شود.)

Under-Posting: هر گاه کاربر چند خاصیت را از دست می دهد این عمل رخ می دهد. برای مثال، فرض کنید کاربر کد زیر را ارسال می کند:

{"Id":4, "Name":"Gizmo"}

در اینجا، کاربر مقادیری برای Price و Weight مشخص نمی کند. قالب JSON به خاصیت هایی که تعریف نشده اند مقدار پیش فرض 0 می دهد.

Model state معتبر است (IsValid) زیرا 0 برای این خاصیت ها یک مقدار valid می باشد. البته این باعث بروز مشکلاتی نیز می شود. برای مثال، در یک عملگر ، شما ممکن است بخواهید تشخیص دهید کاربر 0 و یا خالی (not-set) وارد کرده است. برای وادار کردن کاربر به قرار دادن یک مقدار، خاصیت را برای پذیرش مقدار خالی (nullable) تنظیم کنید و attribute Required را بالای آن بنویسید:

[Required]public decimal? Price { get; set; }

Over-Posting: کاربر می تواند اطلاعات بیشتری نسبت به آنچه انتظار دارید ارسال کند. برای مثال:

{"Id":4, "Name":"Gizmo", "Color":"Blue"}

در اینجا JSON شامل خاصیت “Color” که در مدل Product وجود ندارد می شود. در این صورت، قالب JSON به سادگی از این مقدار چشم پوشی می کند.(قالب XML هم کار مشابه با این را انجام می دهد.)اگر خاصیت هایی که شما برای فقط خواندنی(Read-only) برجسته ساختید،Over-Posting شود ، باعث خطاهایی می شود. برای مثال :

public class UserProfile
{
   public string Name { get;set;}
   public Uri Blog { get;set;}
   public bool IsAdmin { get;set;} // uh-oh!
}

مطمئنا شما نمی خواهید کاربران خاصیت IsAdmin را به روز رسانی کنند و خود را به Administrator ارتقا دهند. مطمئن ترین روش این است که از یک کلاس model استفاده کنید تا دقیقا مشخص کند کاربر اجازه ارسال چه چیزی دارد:

public class UserProfileDTO
{
   public string Name { get;set;}
   public Uri Blog { get;set;}
   // Leave out "IsAdmin"
}

مدیریت کردن خطاهای اعتبارسنجی

وقتی اعتبارسنجی Web API به مشکل می خورد به صورت خودکار خطا را به سمت کاربر برنمی گرداند. این برای آن است که وضعیت model را بررسی کند و پاسخ مناسب بدهد. شما همچنین می توانید یک فیلتر به اکشن اضافه کنید تا برای بررسی وضعیت model قبل از فراخوانی ، action کنترولر بسازد. کد زیر یک مثال را نشان می دهد:

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding;
namespace MyApi.Filters
{
   public class ValidateModelAttribute : ActionFilterAttribute
   {
       public override void OnActionExecuting(HttpActionContext actionContext)
       {
           if (actionContext.ModelState.IsValid == false)
           {
               actionContext.Response = actionContext.Request.CreateErrorResponse(
                   HttpStatusCode.BadRequest, actionContext.ModelState);
           }
       }
   }
}

اگر اعتبارسنجی model با خطا رو به رو شود این فیلتر یک پاسخ HTTP که شامل خطاهای اعتبارسنجی باشد بر می گرداند. در این صورت، action کنترولر فراخوانی نمی شود.

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Date: Tue, 16 Jul 2013 21:02:29 GMT
Content-Length: 331
{
 "Message": "The request is invalid.",
 "ModelState": {
   "product": [
     "Required property 'Name' not found in JSON. Path '', line 1, position 17."
   ],
   "product.Name": [
     "The Name field is required."
   ],
   "product.Weight": [
     "The field Weight must be between 0 and 999."
   ]
 }
}

برای اضافه کردن این فیلتر به کنترولر های Web API در زمان پیکره بندی، یک مورد فیلتر از مجموعه HttpConfiguration.Filters اضافه می کند.

public static class WebApiConfig
{
   public static void Register(HttpConfiguration config)
   {
       config.Filters.Add(new ValidateModelAttribute());
       // ...
   }
}

انتخاب دیگر این است که فیلتر را به عنوان attribute روی کنترولر خودمان یا action های کنترولر تنظیم کنیم:

public class ProductsController : ApiController
{
   [ValidateModel]
   public HttpResponseMessage Post(Product product)
   {
       // ...
   }
}
  • 1246
  •    392
  • تاریخ ارسال :   1395/03/21

دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
اعتبار سنجی Model در Asp.Net Web API
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .