الإرشادات التفصيلية: تطبيق المصادقة و التخويل المخصصة

توضح هذه معاينة كيفية تطبيق مصادقة و تخويل مخصص باستخدام فئات مشتقة من IIdentity و IPrincipal . هذه معاينة توضح أيضاً كيفية منع الهوية الافتراضية لمؤشر ترابط التطبيق ، و هوية Windows بتعيين My.User.CurrentPrincipal إلى مثيل فئة مشتقة من IPrincipal . تتوفر معلومات المستخدم الجديد مباشرة خلال كائن My.User الذي يرجع معلومات حول هوية المستخدم الحالية لمؤشر الترابط.

تطبيقات العمل غالباً ما توفر الوصول إلى البيانات أو موارد التي تعتمد تشغيل بيانات اعتماد الموفرة من قبل مستخدم. بشكل عام، مثل تطبيقات تحقق دور مستخدم وتوفر الوصول إلى موارد استناداً إلى ذلك الدور. وقت تشغيل اللغة العامة يوفر دعم التخويل القائم على الدور استناداً إلى حساب Windows أو مخصص الهوية. لمزيد من المعلومات، راجع تستند إلى دور الأمان.

الشروع في العمل

أولاً، قم بإعداد المشروع مع نموذج رئيسي و نموذج تسجيل دخول و قم بتكوينه لاستخدام مصادقة مخصصة.

لإنشاء تطبيق النموذج

  1. قم بإنشاء نافذة Visual Basic جديدة لمشروع التطبيق . لمزيد من المعلومات، راجع كيفية القيام بما يلي: إنشاء مشروع تطبيقات Windows.

    الاسم الافتراضي للنموذج الأساسي هو Form1 .

  2. في مشروع قائمة ، انقر فوق إضافة عنصر جديد .

  3. حدد قالبنموذج تسجيل الدخول و انقر فوق إضافة.

    الاسم الافتراضي لنموذج التسجيل هو LoginForm1 .

  4. في مشروع قائمة ، انقر فوق إضافة عنصر جديد .

  5. حدد قالب فئة، و غير الاسم إلى SampleIIdentity، ثم انقر فوق إضافة.

  6. في مشروع قائمة ، انقر فوق إضافة عنصر جديد .

  7. حدد قالب فئة، و غير الاسم إلى SampleIPrincipal، ثم انقر فوق إضافة.

  8. من قائمة مشروع، انقر فوق خصائص اسم التطبيق <ApplicationName .

  9. في مصمم المشروع, انقر فوق علامة التبويب تطبيق.

  10. غيروضع المصادقة المنسدلة إلى تعريف التطبيق.

لتكوين نموذج رئيسي

  1. التحويل إلى Form1 في مصمم النماذج.

  2. قم بإضافةزر إلى Form1 من مربع الأدوات.

    الاسم الافتراضي للزر هو Button1.

  3. تغيير نص الزر إلى مصادقة.

  4. قم بإضافة تسمية إلى Form1 من مربع الأدوات .

    الاسم الافتراضي للتسمية هو Label1 .

  5. قم بتغيير نص التسمية إلى سلسلة فارغة.

  6. قم بإضافة تسمية إلى Form1 من مربع الأدوات .

    الاسم الافتراضي للتسمية هو Label2 .

  7. قم بتغيير نص التسمية إلى سلسلة فارغة.

  8. انقر نقراً مزدوجاً فوقButton1 لإنشاء معالج الحدث الخاص بحدث Click و من ثم افتح محرر التعليمات البرمجية.

  9. قم بإضافة التعليمات البرمجية التالية للأسلوب 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

  1. حدد ملف SampleIIdentity.vb في مستكشف الحل.

    هذه الفئة تغلف هوية المستخدم .

  2. في السطر الذي يلي Public Class SampleIIdentity، قم بإضافة التعليمات البرمجية التالية لترث من IIdentity.

    Implements System.Security.Principal.IIdentity
    

    بعد إضافة التعليمات برمجية و ضغط زر Enter ، فإن محرر التعليمات البرمجية ينشئ بقية الخصائص التي يجب تطبيقها.

  3. قم بإضافة حقول خاصة لتخزين اسم المستخدم و القيمة التي تشير إلى حالة مصادقة المستخدم.

    Private nameValue As String
    Private authenticatedValue As Boolean
    Private roleValue As ApplicationServices.BuiltInRole
    
  4. قم بإدخال التعليمات البرمجية التالية في خاصية AuthenticationType.

    تحتاج خاصية AuthenticationType لإرجاع سلسلة تشير إلى آلية المصادقة الحالية.

    يستخدم هذا المثال المصادقة المحددة بوضوح و كذلك السلسلة هي "مصادقة مخصصة". إذا تم تخزين بيانات مصادقة المستخدم في قاعدة بيانات خادم SQL , قد تكون القيمة "SqlDatabase".

    Return "Custom Authentication"
    
  5. قم بإدخال التعليمات البرمجية التالية في خاصية IsAuthenticated.

    Return authenticatedValue
    

    تحتاج خاصية IsAuthenticated لإرجاع القيمة تشير إلى ما إذا كان قد تم مصادقة المستخدم.

  6. تحتاج خاصية Name لإرجاع اسم المستخدم المقترن مع هذه الهوية.

    قم بإدخال التعليمات البرمجية التالية في خاصية Name.

    Return nameValue
    
  7. إنشاء خاصية ترجع دور المستخدم.

    Public ReadOnly Property Role() As ApplicationServices.BuiltInRole
        Get
            Return roleValue
        End Get
    End Property
    
  8. قم بإنشاء أسلوب 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
    
  9. إنشاء أسلوب يسمى 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
    
  10. إنشاء دالات باسم 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

  1. حدد ملف SampleIPrincipal.vb في مستكشف الحل.

    هذه الفئة تغلف هوية المستخدم . يمكنك استخدام كائن My.User لإرفاق هذا الأساسي إلى مؤشر الترابط الحالي و الوصول إلى هوية المستخدم .

  2. في السطر الذي يلي Public Class SampleIPrincipal، قم بإضافة التعليمات البرمجية التالية لترث من IPrincipal.

    Implements System.Security.Principal.IPrincipal
    

    بعد إضافة تلك التعليمات البرمجية و ضغط زر Enter ، فإن محرر التعليمات البرمجية ينشئ خاصية stub و الأسلوب الذي يجب تطبيقه.

  3. إضافة حقل خاص لتخزين الهوية المقترنة مع هذا الأساسي.

    Private identityValue As SampleIIdentity
    
  4. قم بإدخال التعليمات البرمجية التالية في خاصية Identity.

    Return identityValue
    

    تحتاج خاصية Identity لإرجاع هوية المستخدم من الأساس الحالي.

  5. قم بإدخال التعليمات البرمجية التالية في الأسلوب IsInRole .

    أسلوب IsInRole يُستخدم لتحديد ما إذا كان الأساس الحالي ينتمي إلى الدور المحدد.

    Return role = identityValue.Role.ToString
    
  6. إنشاء أسلوب 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 لتعيين هوية مؤشر الترابط الحالي لذلك المثيل .

لتكوين نموذج تسجيل الدخول

  1. تحديدLoginForm1 في المصمم.

  2. انقر نقراً مزودجاً فوق زر ‏‏موافق لفتح محرر التعليمات البرمجية لحدث Click .

  3. قم باستبدال التعليمات البرمجية في الأسلوب 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
    

اختبار التطبيق

والآن بعد أن احتوى التطبيق على رمز المصادقة يمكنك تشغيل التطبيق ثم حاول مصادقة المستخدم.

لإختبار التطبيق

  1. ابدأ التطبيق.

  2. انقر فوقمصادقة.

    يتم فتح نموذج تسجيل الدخول.

  3. اكتب TestUser في صندوق اسم المستخدم و BadPassword في صندوق كلمة المرور ثم انقر فوق موافق .

    مربع الرسالة يفتح عبارة تفيد أن زوج اسم و كلمة مرور المستخدم غير صحيح.

  4. انقر فوق موافق لإغلاق مربع الرسالة.

  5. انقر فوقإلغاء الأمر لاستبعاد نموذج تسجيل الدخول.

    التسميات في النموذج الرئيسي توضح لم يتم مصادقة المستخدموالمستخدم ليس مسؤول.

  6. انقر فوقمصادقة.

    يتم فتح نموذج تسجيل الدخول.

  7. اكتب TestUser في صندوق اسم المستخدم و BadPassword في صندوق كلمة المرور ثم انقر فوق موافق . تأكد من إدخال كلمة المرور باستخدام الأحرف الكبيرة الصحيحة.

    التسميات في النموذج الرئيسي تقول الآن TestUser المصادقة و المستخدم هو المسؤول.

راجع أيضًا:

المهام

كيفية القيام بما يلي: يعيّن إلى البيانات في قاعدة بيانات

المرجع

User

IIdentity

IPrincipal

المبادئ

الوصول إلى بيانات المستخدم

موارد أخرى

المصادقة و التخويل في NET Framework. باستخدام Visual Basic