التحقق في الـ Web APIs بإستخدام الـ Request Headers

05 سبتمبر 2016     535 مشاهدة    0 تعليق
تم النشر في #Security  #Web APIs 

التحقق في الـ Web APIs يختلف من التحقق في صفحات الويب وذلك لكون الـ Web APIs لا تحتوي على واجهات يستطيع من خلالها المستخدم التحقق من هويته. سنتعرف اليوم على طريقة بسيطة يمكن من خلالها التحقق في الـ Web APIs وذلك من خلال الـ HTTP Headers التي يتم إرسالها أثناء الطلب.

هنالك الكثير من الطرق الني يتم التحقق من خلالها في الـ Web APIs مثل التحقق عن طريق الفيسبوك وتويتر وغيرهما.

ولكن هنالك طرق سهلة للتحقق غير التي تم ذكرها سابقاً وهي التحقق بإستخدام الـ Request Headers, ببساطه يتم إرسال معلومات التحقق (إسم المستخدم وكلمة المرور) عن طريق الطلب وذلك عبر البروتوكول HTTP, ومن ثم يتم التحقق من هوية المستخدم في جانب الخادم.

في الشفرة أدناه تم إنشاء الفئة AuthorizaeHeadersAttributes والتي بدورها ترث من الفئة AuthorizationAttribute ليتم من خلالها مقاطعة الطلب قبل إستدعاء الدوال في الـ WebAPIs

public class AuthorizeHeadersAttribute : AuthorizationFilterAttribute  
{
private const string UsernameKey = "X-Credentials-Username";
private const string PasswordKey = "X-Credentials-Password";
private bool _isAuthorized = false;

public AuthorizeHeadersAttribute()
{

}

public override void OnAuthorization(HttpActionContext actionContext)
{
var request = actionContext.Request;

if (actionContext.Request.RequestUri.Scheme == Uri.UriSchemeHttps && request.Headers.Contains(UsernameKey) && request.Headers.Contains(PasswordKey))
{
var username = request.Headers.Where(h => h.Key == UsernameKey).First().Value;
var password = request.Headers.Where(h => h.Key == PasswordKey).First().Value;

// Validate the credentials in the data store
if (Validate(username, password))
{
isAuthorized = false;
}
else
{
this.isAuthorized = true;
}
}


if (!this.isAuthorized)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
}
}

protected virtual bool IsAuthorized(HttpActionContext actionContext)
{
return _isAuthorized;
}
}

وبعدها يمكننا إستخدم الـ AuthorizeHeadersAttribute على مستوى الـ Controller أو الـ Action على النحو التالي:

[AuthorizeHeaders]  
public HttpResponseMessage AuthTest()
{
return Request.CreateResponse(HttpStatusCode.OK, "Hello");
}

وأريد التنويه أنه يجب إضافه الـ Headers قبل إستدعاء الدوال من الـ WebAPIs في جانب العميل الا وهما X-Credentials-Username, X-Credentials-Password.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك