الإرشادات التفصيلية: تطبيق المصادقة و التخويل المخصصة
توضح هذه معاينة كيفية تطبيق مصادقة و تخويل مخصص باستخدام فئات مشتقة من IIdentity و IPrincipal . هذه معاينة توضح أيضاً كيفية منع الهوية الافتراضية لمؤشر ترابط التطبيق ، و هوية Windows بتعيين My.User.CurrentPrincipal إلى مثيل فئة مشتقة من IPrincipal . تتوفر معلومات المستخدم الجديد مباشرة خلال كائن My.User الذي يرجع معلومات حول هوية المستخدم الحالية لمؤشر الترابط.
تطبيقات العمل غالباً ما توفر الوصول إلى البيانات أو موارد التي تعتمد تشغيل بيانات اعتماد الموفرة من قبل مستخدم. بشكل عام، مثل تطبيقات تحقق دور مستخدم وتوفر الوصول إلى موارد استناداً إلى ذلك الدور. وقت تشغيل اللغة العامة يوفر دعم التخويل القائم على الدور استناداً إلى حساب Windows أو مخصص الهوية. لمزيد من المعلومات، راجع تستند إلى دور الأمان.
الشروع في العمل
أولاً، قم بإعداد المشروع مع نموذج رئيسي و نموذج تسجيل دخول و قم بتكوينه لاستخدام مصادقة مخصصة.
لإنشاء تطبيق النموذج
قم بإنشاء نافذة Visual Basic جديدة لمشروع التطبيق . لمزيد من المعلومات، راجع كيفية القيام بما يلي: إنشاء مشروع تطبيقات Windows.
الاسم الافتراضي للنموذج الأساسي هو Form1 .
في مشروع قائمة ، انقر فوق إضافة عنصر جديد .
حدد قالبنموذج تسجيل الدخول و انقر فوق إضافة.
الاسم الافتراضي لنموذج التسجيل هو LoginForm1 .
في مشروع قائمة ، انقر فوق إضافة عنصر جديد .
حدد قالب فئة، و غير الاسم إلى SampleIIdentity، ثم انقر فوق إضافة.
في مشروع قائمة ، انقر فوق إضافة عنصر جديد .
حدد قالب فئة، و غير الاسم إلى SampleIPrincipal، ثم انقر فوق إضافة.
من قائمة مشروع، انقر فوق خصائص اسم التطبيق <ApplicationName .
في مصمم المشروع, انقر فوق علامة التبويب تطبيق.
غيروضع المصادقة المنسدلة إلى تعريف التطبيق.
لتكوين نموذج رئيسي
التحويل إلى Form1 في مصمم النماذج.
قم بإضافةزر إلى Form1 من مربع الأدوات.
الاسم الافتراضي للزر هو Button1.
تغيير نص الزر إلى مصادقة.
قم بإضافة تسمية إلى Form1 من مربع الأدوات .
الاسم الافتراضي للتسمية هو Label1 .
قم بتغيير نص التسمية إلى سلسلة فارغة.
قم بإضافة تسمية إلى Form1 من مربع الأدوات .
الاسم الافتراضي للتسمية هو Label2 .
قم بتغيير نص التسمية إلى سلسلة فارغة.
انقر نقراً مزدوجاً فوقButton1 لإنشاء معالج الحدث الخاص بحدث Click و من ثم افتح محرر التعليمات البرمجية.
قم بإضافة التعليمات البرمجية التالية للأسلوب Button1_Click .
My.Forms.LoginForm1.ShowDialog() ' Check if the user was authenticated. If My.User.IsAuthenticated Then Me.Label1.Text = "Authenticated " & My.User.Name Else Me.Label1.Text = "User not authenticated" End If If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then Me.Label2.Text = "User is an Administrator" Else Me.Label2.Text = "User is not an Administrator" End If
يمكنك تشغيل التطبيق، و لكن بسبب عدم وجود تعليمات برمجية مصدق عليها , سوف لا تصدق على أي مستخدم . إضافة التعليمات البرمجية المصدق عليها تمت مناقشتها في القسم التالي.
إنشاء الهوية
يستخدم .NET Framework واجهات IIdentity و IPrincipal كأساس للمصادقة و التخويل . يمكن لتطبيقك استخدام مصادقة المستخدم المخصصة عن طريق تطبيق هذه الواجهات كما توضح هذه الإجراءات .
لإنشاء الفئة التي تطبق IIdentity
حدد ملف SampleIIdentity.vb في مستكشف الحل.
هذه الفئة تغلف هوية المستخدم .
في السطر الذي يلي Public Class SampleIIdentity، قم بإضافة التعليمات البرمجية التالية لترث من IIdentity.
Implements System.Security.Principal.IIdentity
بعد إضافة التعليمات برمجية و ضغط زر Enter ، فإن محرر التعليمات البرمجية ينشئ بقية الخصائص التي يجب تطبيقها.
قم بإضافة حقول خاصة لتخزين اسم المستخدم و القيمة التي تشير إلى حالة مصادقة المستخدم.
Private nameValue As String Private authenticatedValue As Boolean Private roleValue As ApplicationServices.BuiltInRole
قم بإدخال التعليمات البرمجية التالية في خاصية AuthenticationType.
تحتاج خاصية AuthenticationType لإرجاع سلسلة تشير إلى آلية المصادقة الحالية.
يستخدم هذا المثال المصادقة المحددة بوضوح و كذلك السلسلة هي "مصادقة مخصصة". إذا تم تخزين بيانات مصادقة المستخدم في قاعدة بيانات خادم SQL , قد تكون القيمة "SqlDatabase".
Return "Custom Authentication"
قم بإدخال التعليمات البرمجية التالية في خاصية IsAuthenticated.
Return authenticatedValue
تحتاج خاصية IsAuthenticated لإرجاع القيمة تشير إلى ما إذا كان قد تم مصادقة المستخدم.
تحتاج خاصية Name لإرجاع اسم المستخدم المقترن مع هذه الهوية.
قم بإدخال التعليمات البرمجية التالية في خاصية Name.
Return nameValue
إنشاء خاصية ترجع دور المستخدم.
Public ReadOnly Property Role() As ApplicationServices.BuiltInRole Get Return roleValue End Get End Property
قم بإنشاء أسلوب Sub New لتهيئة الفئة عن طريق مصادقة المستخدم ثم عين اسم المستخدم و الدور استناداً إلى الاسم و كلمة المرور.
هذا الأسلوب يستدعي أسلوب باسم IsValidNameAndPassword لتحديد ما إذا كانت تركيبة اسم المستخدم و كلمة المرور صالحة.
Public Sub New(ByVal name As String, ByVal password As String) ' The name is not case sensitive, but the password is. If IsValidNameAndPassword(name, password) Then nameValue = name authenticatedValue = True roleValue = ApplicationServices.BuiltInRole.Administrator Else nameValue = "" authenticatedValue = False roleValue = ApplicationServices.BuiltInRole.Guest End If End Sub
إنشاء أسلوب يسمى IsValidNameAndPassword و الذي يحدد ما إذا كان اسم مستخدم و كلمة المرور صالحين.
ملاحظة الأمان يجب على المصادقة الخوارزمية معاملة كلمات المرور بشكل آمن. على سبيل المثال، يجب عدم تخزين كلمة المرور في حقل الفئة.
لا يجب أن تقوم بتخزين كلمات مرور المستخدم في النظام الخاص بك لأنه إذا تسربت تلك المعلومات لا يوجد المزيد من الأمان. يمكنك تخزين تجزئة من كلمة المرور لكل مستخدم. (وظيفة تجزئة تخلط البيانات بحيث لا يمكن استخلاص الإدخال من الإخراج.) كلمة المرور لا يمكن تحديدها مباشرة من تجزئة كلمة المرور.
ومع ذلك، المستخدم الماكر قد يستغرق وقتاً لإنشاء قاموس التجزئات لكل كلمات المرور المحتملة ثم البحث عن كلمة المرور من أجل التجزئة المعطاة. للحماية ضد هذا النوع من الهجوم يجب إضافة salt (اتفاقية حد) إلى كلمة المرور قبل تجزئتها فإنه لإنشاء تجزئة salted. salt تعتبر بيانات إضافية فريدة لكل كلمة المرور و التي تجعل من المستحيل precompute (إعادة حساب) قاموس التجزئة.
لحماية كلمات المرور من المستخدمين المؤذيين, يجب فقط تخزين تجزئات salted لكلمات المرور و يفضل أن يكون ذلك على كمبيوتر آمن. من الصعب للغاية على المستخدم المتطفل استرداد كلمة المرور من تجزئة salted. يستخدم هذا المثال GetHashedPassword و GetSalt لتحميل تجزئة كلمة المرور و salt الخاصة بالمستخدم .
Private Function IsValidNameAndPassword( ByVal username As String, ByVal password As String) As Boolean ' Look up the stored hashed password and salt for the username. Dim storedHashedPW As String = GetHashedPassword(username) Dim salt As String = GetSalt(username) 'Create the salted hash. Dim rawSalted As String = salt & Trim(password) Dim saltedPwBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(rawSalted) Dim sha1 As New System.Security.Cryptography. SHA1CryptoServiceProvider Dim hashedPwBytes() As Byte = sha1.ComputeHash(saltedPwBytes) Dim hashedPw As String = Convert.ToBase64String(hashedPwBytes) ' Compare the hashed password with the stored password. Return hashedPw = storedHashedPW End Function
إنشاء دالات باسم GetHashedPassword و GetSalt و التي ترجع كلمة المرور المجزأة و salt لمستخدم معين .
ملاحظة الأمان يجب تجنب الترميز الصعب لكلمات المرور المجزأة و salts في تطبيقات العميل لسببين. أولاً قد يتمكن المستخدمون المؤذيون من الوصول إليها و العثور على تضارب التجزئة. ثانياً، لا يمكنك تغيير أو إبطال كلمة مرور المستخدم . يجب حصول التطبيق على كلمة المرور المجزأة و salt للمستخدم المعطى من المصدر الآمن الذي يحتفظ به المسؤول.
بالرغم من البساطة, هذا المثال لديه تعليمات برمجية مضمّنة ، كلمة مرور مجزأة و salt , و يجب عليك استخدام أسلوب أكثر أماناً في التعليمات البرمجية للإنتاج. على سبيل المثال، يمكن تخزين معلومات المستخدم في قاعدة بيانات خادم SQL و الوصول إليها مع الإجراءات المخزنة. لمزيد من المعلومات، راجع كيفية القيام بما يلي: يعيّن إلى البيانات في قاعدة بيانات.
ملاحظة
مطابقة كلمة المرور إلى كلمة المرور المجزأة الثابت تلوينها معطى في مقطع "اختبار التطبيق".
Private Function GetHashedPassword(ByVal username As String) As String ' Code that gets the user's hashed password goes here. ' This example uses a hard-coded hashed passcode. ' In general, the hashed passcode should be stored ' outside of the application. If Trim(username).ToLower = "testuser" Then Return "ZFFzgfsGjgtmExzWBRmZI5S4w6o=" Else Return "" End If End Function Private Function GetSalt(ByVal username As String) As String ' Code that gets the user's salt goes here. ' This example uses a hard-coded salt. ' In general, the salt should be stored ' outside of the application. If Trim(username).ToLower = "testuser" Then Return "Should be a different random value for each user" Else Return "" End If End Function
يجب أن تحتوي ملفات SampleIIdentity.vb الآن على التعليمات البرمجية التالية :
Public Class SampleIIdentity
Implements System.Security.Principal.IIdentity
Private nameValue As String
Private authenticatedValue As Boolean
Private roleValue As ApplicationServices.BuiltInRole
Public ReadOnly Property AuthenticationType() As String Implements System.Security.Principal.IIdentity.AuthenticationType
Get
Return "Custom Authentication"
End Get
End Property
Public ReadOnly Property IsAuthenticated() As Boolean Implements System.Security.Principal.IIdentity.IsAuthenticated
Get
Return authenticatedValue
End Get
End Property
Public ReadOnly Property Name() As String Implements System.Security.Principal.IIdentity.Name
Get
Return nameValue
End Get
End Property
Public ReadOnly Property Role() As ApplicationServices.BuiltInRole
Get
Return roleValue
End Get
End Property
Public Sub New(ByVal name As String, ByVal password As String)
' The name is not case sensitive, but the password is.
If IsValidNameAndPassword(name, password) Then
nameValue = name
authenticatedValue = True
roleValue = ApplicationServices.BuiltInRole.Administrator
Else
nameValue = ""
authenticatedValue = False
roleValue = ApplicationServices.BuiltInRole.Guest
End If
End Sub
Private Function IsValidNameAndPassword(
ByVal username As String,
ByVal password As String) As Boolean
' Look up the stored hashed password and salt for the username.
Dim storedHashedPW As String = GetHashedPassword(username)
Dim salt As String = GetSalt(username)
'Create the salted hash.
Dim rawSalted As String = salt & Trim(password)
Dim saltedPwBytes() As Byte =
System.Text.Encoding.Unicode.GetBytes(rawSalted)
Dim sha1 As New System.Security.Cryptography.
SHA1CryptoServiceProvider
Dim hashedPwBytes() As Byte = sha1.ComputeHash(saltedPwBytes)
Dim hashedPw As String = Convert.ToBase64String(hashedPwBytes)
' Compare the hashed password with the stored password.
Return hashedPw = storedHashedPW
End Function
Private Function GetHashedPassword(ByVal username As String) As String
' Code that gets the user's hashed password goes here.
' This example uses a hard-coded hashed passcode.
' In general, the hashed passcode should be stored
' outside of the application.
If Trim(username).ToLower = "testuser" Then
Return "ZFFzgfsGjgtmExzWBRmZI5S4w6o="
Else
Return ""
End If
End Function
Private Function GetSalt(ByVal username As String) As String
' Code that gets the user's salt goes here.
' This example uses a hard-coded salt.
' In general, the salt should be stored
' outside of the application.
If Trim(username).ToLower = "testuser" Then
Return "Should be a different random value for each user"
Else
Return ""
End If
End Function
End Class
إنشاء الأساسي
بعد ذلك، تحتاج لتطبيق فئة مشتقة من IPrincipal، فإنه يتم إرجاع مثيلات فئة SampleIIdentity .
لإنشاء الفئة التي تطبق IPrincipal
حدد ملف SampleIPrincipal.vb في مستكشف الحل.
هذه الفئة تغلف هوية المستخدم . يمكنك استخدام كائن My.User لإرفاق هذا الأساسي إلى مؤشر الترابط الحالي و الوصول إلى هوية المستخدم .
في السطر الذي يلي Public Class SampleIPrincipal، قم بإضافة التعليمات البرمجية التالية لترث من IPrincipal.
Implements System.Security.Principal.IPrincipal
بعد إضافة تلك التعليمات البرمجية و ضغط زر Enter ، فإن محرر التعليمات البرمجية ينشئ خاصية stub و الأسلوب الذي يجب تطبيقه.
إضافة حقل خاص لتخزين الهوية المقترنة مع هذا الأساسي.
Private identityValue As SampleIIdentity
قم بإدخال التعليمات البرمجية التالية في خاصية Identity.
Return identityValue
تحتاج خاصية Identity لإرجاع هوية المستخدم من الأساس الحالي.
قم بإدخال التعليمات البرمجية التالية في الأسلوب IsInRole .
أسلوب IsInRole يُستخدم لتحديد ما إذا كان الأساس الحالي ينتمي إلى الدور المحدد.
Return role = identityValue.Role.ToString
إنشاء أسلوب Sub New لتهيئة الفئة مع مثيل جديد لـ SampleIIdentity مع إعطاء اسم لبمستخدم و كلمة المرور .
Public Sub New(ByVal name As String, ByVal password As String) identityValue = New SampleIIdentity(name, password) End Sub
هذه التعليمات البرمجية تعين هوية المستخدم لفئة SampleIPrincipal .
يجب أن يحتوي ملف SampleIPrincipal.vb الآن على التعليمات البرمجية التالية :
Public Class SampleIPrincipal
Implements System.Security.Principal.IPrincipal
Private identityValue As SampleIIdentity
Public ReadOnly Property Identity() As System.Security.Principal.IIdentity Implements System.Security.Principal.IPrincipal.Identity
Get
Return identityValue
End Get
End Property
Public Function IsInRole(ByVal role As String) As Boolean Implements System.Security.Principal.IPrincipal.IsInRole
Return role = identityValue.Role.ToString
End Function
Public Sub New(ByVal name As String, ByVal password As String)
identityValue = New SampleIIdentity(name, password)
End Sub
End Class
الاتصال بنموذج تسجيل الدخول
يمكن استخدام تطبيق نموذج تسجيل الدخول لتجميع اسم المستخدم و كلمة المرور . يمكن استخدام هذه المعلومات لتهيّئة مثيل فئة SampleIPrincipal و استخدام كائن My.User لتعيين هوية مؤشر الترابط الحالي لذلك المثيل .
لتكوين نموذج تسجيل الدخول
تحديدLoginForm1 في المصمم.
انقر نقراً مزودجاً فوق زر موافق لفتح محرر التعليمات البرمجية لحدث Click .
قم باستبدال التعليمات البرمجية في الأسلوب OK_Click بالتعليمات البرمجية التالية.
Dim samplePrincipal As New SampleIPrincipal( Me.UsernameTextBox.Text, Me.PasswordTextBox.Text) Me.PasswordTextBox.Text = "" If (Not samplePrincipal.Identity.IsAuthenticated) Then ' The user is still not validated. MsgBox("The username and password pair is incorrect") Else ' Update the current principal. My.User.CurrentPrincipal = samplePrincipal Me.Close() End If
اختبار التطبيق
والآن بعد أن احتوى التطبيق على رمز المصادقة يمكنك تشغيل التطبيق ثم حاول مصادقة المستخدم.
لإختبار التطبيق
ابدأ التطبيق.
انقر فوقمصادقة.
يتم فتح نموذج تسجيل الدخول.
اكتب TestUser في صندوق اسم المستخدم و BadPassword في صندوق كلمة المرور ثم انقر فوق موافق .
مربع الرسالة يفتح عبارة تفيد أن زوج اسم و كلمة مرور المستخدم غير صحيح.
انقر فوق موافق لإغلاق مربع الرسالة.
انقر فوقإلغاء الأمر لاستبعاد نموذج تسجيل الدخول.
التسميات في النموذج الرئيسي توضح لم يتم مصادقة المستخدموالمستخدم ليس مسؤول.
انقر فوقمصادقة.
يتم فتح نموذج تسجيل الدخول.
اكتب TestUser في صندوق اسم المستخدم و BadPassword في صندوق كلمة المرور ثم انقر فوق موافق . تأكد من إدخال كلمة المرور باستخدام الأحرف الكبيرة الصحيحة.
التسميات في النموذج الرئيسي تقول الآن TestUser المصادقة و المستخدم هو المسؤول.
راجع أيضًا:
المهام
كيفية القيام بما يلي: يعيّن إلى البيانات في قاعدة بيانات