احراز هویت مبتنی بر Token توسط Web Api

در این مقاله قصد دارم چگونگی ایمن سازی ASP.NET Web API  با استفاده از روش Token Based Authentication (تایید هویت مبتنی بر توکن ها) را نشان دهم.

ASP.NET Web API فریم ورکی است که ایجاد سرویس های HTTP  را بسیار آسان کرده است. سرویس های مبتنی بر HTTP کلاینت های زیادی را در بر می گیرد: مرورگرها، موبایل ها و کامپیوترهای شخصی. امروزه Web API adoption به سرعت در حال گسترش است. در این شرایط، ضرورت توجه به مسائل مربوطه به امنیت به چشم می خورد؛ پس تمامی کلاینت هایی که به نحوی با داده های مربوط به سرویس های Web API در ارتباط هستند باید نسبت به تهدیدات امنیتی، تجهیز شوند.

رایج ترین روش برای ایمن سازی منابع سروری، تایید هویت کاربران در WEB API ، استفاده از Token های نشانه گذاری شده است؛ که شامل داده های کافی برای شناسایی یک کاربر خاص است.

این روش نامیده می شود البته به دلایل زیر:

اتصال سست(Loose Coupling): اپلیکیشنی که در سمت کلاینت است، به یک بخش مختص برای احراز هویت متصل نیست. Token تولید شده، اعتبارسنجی می شود و توسط سرور، احراز هویت انجام می شود.

سازگاری با تلفن های همراه(Mobile Friendly): در پلتفرم های پایه مثل iOS،Android، Windows 8 ، مدیریت کوکی ها کار آسانی نیست. با استفاده از روش مبتنی بر توکن ،مدیریت کوکی ها بسیار آسان می شود.

Token

احراز هویت مبتنی بر توکن ها چگونه کار می کند؟


در این روش ابتدا برنامه سرویس گیرنده درخواست احراز هویتی را با اعتبار مناسبی برای سرور می فرستد. نام کاربری و رمز عبور صحیح باشند قسمت احراز هویت سرور پاسخی را در قالب توکن می فرستد.این توکن شامل اطلاعات کافی برای شناسایی یک کاربر خاص و همچنین تاریخ انقضااین اتصال، می دهد. سپس برنامه سرویس گیرنده برای دسترسی به منابع، در درخواست های بعدی، از این توکن استفاده می کند تا زمانی که این توکن معتبر باشد.

مراحل زیر را مرحله به مرحله انجام دهید تا قسمت اول احراز هویت مبتنی بر توکن ها با استفاده از ASP.NET Web API 2  را پیاده سازی کنیم.

در این مقاله از نرم افزار Visual Studio 2013 استفاده می کنیم.

قدم ۱: یک پروژه جدید ایجاد کنید.

به ترتیب به قسمت های menu ، create، projet رفته و گزینه  “asp.net web application”  را انتخاب کنید سپس نام برنامه را وارد کنید در قسمت بعد، مکان مربوط به پروژه را تعیین کنید و در نهایت روی دکمه add  کلیک کنید.

حالا پنجره جدیدی برای انتخاب template  باز می شود. گزینه empty template را انتخاب می کنیم سپس چک باکس را MVC & Web API را فعال می کنیم (از بخش Add folder and core references for ) و در نهایت روی دکمه Ok  کلیک می کنیم.

قدم ۲: از بسته NuGet ، ارجاع های مورد نیاز را به برنامه اضافه کنید.

برای پیاد سازی یک روش مبتنی بر توکن در WEB API ، باید ارجاع های زیر از بسته NuGet   نصب شوند.

۱.Microsoft.Owin.Host.SystemWeb

Microsoft.Owin.Security.OAuth  ۲.

۳.Microsoft.Owin.Cors

برای اضافه کردن این منابع از  NuGet، به قسمت Solution Explorer می رویم و روی  References راست کلیک می کنیم سپس روی Manage NuGet packages  کلیک می کنیم در قسمت بعد، Microsoft.Owin.Host.SystemWeb,  Microsoft.Owin.Security.OAuth & Microsoft.Owin.Cors را سرچ کرده و نصبشان می کنیم.

قدم ۳: یک کلاس، برای اعتبار سنجی درخواست های فرستاده شده از طرف کاربر، با استفاده از توکن ها ایجاد کنید.

حالا به برنامه کلاسی ،برای بررسی اعتبار درخواست تایید کاربر و ایجاد توکن، اضافه می کنیم.

برای اضافه کردن کلاس به قسمت solution explorer می رویم روی نام برنامه مان راست کلیک می کنیم گزینه add  را انتخاب می کنیم سپس New Item… و اینجا کلاس را انتخاب می کنیم. نامی برای کلاس وارد می کنیم و روی دکمه Add  کلیک می کنیم.

در این کلاس برای بازنویسی دو متد  “ValidateClientAuthentication” و “GrantResourceOwnerCredentials” ، از کلاس “OAuthAuthorizationServerProvider” ارث بری می کنیم. متد “ValidateClientAuthentication” برای بررسی صحت برنامه سرویس گیرنده ( برای ساده تر شدن کار، در ادامه روی متد “ValidateClientAuthentication”  تمرکز بیشتری می کنیم) و در متد “GrantResourceOwnerCredentials”   کاربران را احراز هویت می کنیم و اگر تایید شد یک توکن علامت دار ایجاد می کنیم تا کاربر بتواند با آن به منابع سرور دسترسی پیدا کند.

MyAuthorizationServerProvider.cs

 

در خطوط ۱۸ تا ۴۰ از داده های استاتیکی برای تائید اعتبار کاربران استفاده کردیم. در قسمت بعدی این آموزش، وقتی برنامه سرویس گیرنده (در in AngularJS) با روش احراز هویت مبتنی بر توکن پیاده سازی شود برای اعتبار سنجی از پایگاه داده مان استفاده می کنیم.

قدم ۴: Owin Start Up classرا اضافه کنید.

حالا در قسمتی که OAuth Authorization Server را پیکربندی می کنیم ، OWIN Startup  class را اضافه می کنیم.

به قسمت  Solution Explorer می رویم و روی Project Name راست کلیک می کنیم و به Add  رفته و سپس به قسمت New Item ، حالا OWIN Startup class را انتخاب می کنیم و در نهایت نام کلاس را انتخاب می کنیم و Add را انتخاب می کنیم.

Startup.cs

 

قدم ۵: برای بازنویسی نحوه انتخاب متغیرها یک کلاس دیگر را اضافه می کنیم.

هنگامی که در حال ایجاد HTTP REST API هستیم ، باید از کدهای appropriate HTTP response برای نمایش وضعیت پاسخ استفاده کنیم. بهتر است بین ۴۰۱ تا ۴۰۳ کد وضعیت برای authentication/authorization استفاده کنیم. ۴۰۱ (Unauthorized)- این کد نشان می دهد تقاضای فعلی اجرایی نمی شود زیرا اعتبارش برای دسترسی به منبع مورد نظر مورد تائید نیست. ۴۰۳(Forbidden)- وقتی یک کاربر هویتش احراز می شود ولی اجازه تقاضا و دسترسی به منابع را ندارد.

متاسفانه، متغیرهای ASP.NET MVC/Web API [Authorize] به این صورت عمل نمی کنند و همیشه ۴۰۱ را نشان می دهند پس در Web API applicationمان، کلاسی برای بازنویسی این رفتار ایجاد می کنم. اینجا به ۴۰۳ بر می گگردیم وقتی ه کاربر هویتش احراز شده ولی نمی تواند درخواست دسترسی به منابع را بکند.

AuthorizeAttribute.cs

 

قدم ۶: حالا یک WEB API Controller ایجاد می کنیم.

در کنترلر WEB API Controller برخی اقدامات اضافه می شود پس می توانیم بررسی کنیم که آیا احراز هویت با استفاده از توکن خوب کار می کند یا خیر.

به قسمت Solution Explorer می رویم  سپس روی پوشه کنترلرها راست کلیک می کنیم به Add  رفته و سپس به قسمت Controller می رویم WEB API 2 Controller – Empty را انتخاب می کنیم روی دکمه add  کلیک می کنیم  و نام کنترلر را وارد می کنیم(در مثال من نام DataController.cs است.) و در آخر Add را انتخاب می کنیم.

قدم ۷: برای گرفتن اطلاعات از سرور برای تمامی کاربران ناشناس یک اضافه می کنیم.

این را برای تمامی کاربران ناشناس اعمال می کنم. هرنوع درخواستی ( چه تایید شده چه رد شده) می تواند به این دسترسی پیدا کند.

 

قدم ۸: برای گرفتن اطلاعات از سرور برای تمامی کاربرانی که هویتشان احراز شده،  یکaction   اضافه می کنیم.این action را برای تمامی کاربرانی که هویتشان احراز شده اعمال می کنم. ( چه کاربر ادمین باشد یا کاربر معمولی)

 

قدم ۹: برای گرفتن اطلاعات ادمین از سرور،  یکaction  دیگر  اضافه می کنیم.

این فقط مختص ادمین است.

 

قدم ۱۰:  برنامه را اجرا کنید.

پیکربندی WEB APIمان آماده است حالا برنامه را با POSTMAN  تست می کنیم و سپس در قسمت بعدی نحوه ایجاد یک برنامه سمت کلاینت ( AngularJS application) و یک برنامه سمت سرور را نشان خواهم داد تا احراز هویت براساس توکن ها را امتحان کنیم.

Postman  افزونه ای برای مرورگر Chrome است که از آن به عنوان یک برنامه کلاینتی استفاده می شود تا درخواست و پاسخ بین کلاینت و سرور را تست کند.

در این قسمت شما نقش برنامه را نیز ایفا می کنید. پس پیغام خطایی به صورت “The resource cannot be found” دریافت می کنید زیرا در root urlمان هیچ چیزی نداریم اما جای نگرانی نیست در ادامه این کار را انجام خواهیم داد.

ابتدا POSTMAN مان را برای  تست  Web APIمان باز می کنیم  سپس از لینک های زیر استفاده می کنیم…

تست اول:

GET  را انتخاب کنید(تصویر section 1) سپس http://localhost:/api/data/forall  را به عنوان url  را وارد کنید (تصویر section 2) و روی دکمه send  کلیک کنید. حالا  وضعیت ۲۰۰ OK را دریافت می کنیم(تصویر section 3 ) و نتیجه در تصویر section 4نمایش داده شده است. و این به این معنی است که وقتی درخواست ناشناسی آمده اولین به درستی کار کرده است.

اما الان می خواهیم به دومین action  دسترسی پیدا کنیم((GetForAuthenticate with url : http://localhost:/api/data/authenticate)) سپس ۴۰۱ را دریافت کنیم زیرا تاکنون درخواست احراز هویت نشده است. برای سومین action  نتیجه ای مشابه رخ می دهد.

بنابراین برای دسترسی به دومین و سومین action  به چه چیزی احتیاج داریم؟ در ابتدا به Tokenدسترسی که در سرور است احتیاج داریم و سپس می توانیم به وسیله این Tokenدسترسی به دومین و سومین action  دسترسی پیدا کنیم.

تست ۲:دریافت توکن دسترسی.

POST را انتخاب کنید(در section 1)، http://localhost:/token را وارد کنید (در section 2) و سپس روی body کلیک کنید(در section 3) و x-www-form-urlencoded  را انتخاب کنید و ۳ پارامتر وارد کنید، اولین پارامتر.نام کاربری(value : user) دومین پارامتر رمز عبور(value : user) وسومین پارامتر grant_type (value: password). حالا روی دکمه send  کلیک می کنیم و ۲۰۰ OK را دریافت می کنیم (section 4 را نگاه کنید) و توکن دسترسی.( section 5 را مشاهده کنید)

حالا می توانیم به وسیله توکن دسترسی به http://localhost:/api/data/authenticate

دسترسی پیدا کنیم.

تست سوم:دسترسی به منابع نامحدود به وسیله

Token

دسترسی

GET را انتخاب کنید(در section 1)، http://localhost:/api/data/authenticate را وارد کنید (در section 2) و سپس روی Headers کلیک کنید(در section 3) و یک پارامتر وارد کنید(Authorization (value : Bearer))، و سپس روی دکمه send  کلیک می کنیم و  ۲۰۰ OK را دریافت می کنیم (section 4 را نگاه کنید) و نتیجه هم در section 5 قابل مشاهده است.

به روش مشابه می توانیم به سومین action دسترسی پیداکنیم(با استفاده از username : admin and password: admin) اما باید توکن را دریافت کنیم زیرا سومین action فقط برای ادمین قابل دسترسی است.

 

احراز هویت مبتنی بر Token توسط Web Api
4.5 (90%) 2 رایs

(416 نوشته)

C# Programmer , Web Design And Developer , MVC , ASP.NET

فکر شما چیست؟

آدرس ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *

حاصل جمع اعداد را وارد کنید : *