الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية عمل صلاحية الدخول للمشتركين

مغلق
بدأه moh1983 في 3 نوفمبر 2005 · 34 رد · 5,398 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخواني انا بحاجة لعمل صلاحيات دخول للمشتركين في مشروع عملي و اليكم التفاصيل

- سوف يقوم المشترك بأدخال اسم المستخدم و كلمة المرور في textbox

-بعد ذلك سوف يتم التأكد من اسم المستخدم و كلمة المرور و توافقهما مع اسم المستخدم و كلمة المرور الموجودات في ال database sql server 2000 .

- الان المشكلة الرئيسية تكمن في الرابط الذي سيدخل اليه المشترك و ليكن على سبيل المثال :-

http://localhost/myproject/showservice.aspx

فبأمكان المشترك حفظ الرابط و ارساله لأحد اصدقائه و من ثم دخول صديقه اليه من غير اشتراك او حتى ادخال اسم المستخدم و كلمة المرور.

فهل يوجد طريقة معينة يمكن من خلالها منع الدخول لهذا الرابط إلا عن طريق ادخال اسم المستخدم و كلمة المرور و الرجاء الرجاء متابعة الموضوع من قبل المشرفين و المتمكنين من لغة asp.net .

ملاحظة :- الكود المستخدم هو vb

#3

السلام عليكم

افتح ملف Web.config

وقم بتغير السطر التالى

فى الكود التالى انا عندى صفحة باسم login.aspx وهيا صفحة تسجيل الدخول فى الموقع او المنتدى المهم

فى حالة ان المستخدم لو لم يسجل دخولة فى الموقع سوف يتم تحويلة الى صفحة تسجيل الدخول

     <authentication mode="Windows" />

الى

     <authentication mode="Forms" >
    <forms loginUrl="login.aspx"></forms>
    </authentication>

و

   <authorization>
        <allow users="*" />

الى

 <authorization>
 <deny users="?"></deny>

وفى شاشة تسجيل الدخول اعمل استيراد لى فضاء الاسماء التالى

  Imports System.Web.Security

وفى button الخاص بتسجيل الدخول اكتب الكود التالى

     Dim com As New SqlClient.SqlCommand
        Dim ob As Object
        com.Connection = CON
        com.CommandText = "select userid from users where user_username=@un and user_password=@pass"
        com.Parameters.Add("@un", TextBox1.Text)
        com.Parameters.Add("@pass", TextBox2.Text)
        CON.Open()
        ob = com.ExecuteScalar()
        CON.Close()
        If Not ob Is Nothing Then
            FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, False)
        Else
            Response.Write("Invalid username or password")
        End If

{وَاتَّقُواْ يَوْمًا تُرْجَعُونَ فِيهِ إِلَى اللّهِ ثُمَّ تُوَفَّى كُلُّ نَفْسٍ مَّا كَسَبَتْ وَهُمْ لاَ يُظْلَمُونَ} (281) سورة البقرة

br17.gif

برنامج الإتصلات الإدارية والارشيف الالكتروني

برنامج الخبير لنقاط البيع المباشرة

#4

مشكورين جميعا و الكود قيد التجريب

#5

السلام عليكم ورحمة الله

إضافة بسيطة على كود الأخ محمد حسين جزاه الله خيراً

هو في الحقيقة هذا الكود سيقوم بمنع استخدام الموقع ككل إلا للمشتركين فقط

ولكن أرى أن الأفضل تقسيم الموقع إلى مناطق و ROLES ، مثلاً نقول أن هناك منطقة في موقعك اسمها SUBSCRIBERS ، مثلاً أنشيء مجلد جديد على الدليل الرئيسي للموقع وسمه SUBSCRIBERS ، وبعد ذلك تضع فيه الصفحات التي لا تريد لأحد أن يصل إليها إلا إذا كان مسجلاً كمشترك عندك

الآن قم بإنشاء ملف جديد WEB.CONFIG داخل هذا المجلد الجديد ، واكتب فيه الكود الآتي (طبعاً هذا مثال بسيط)

<configuration>
	<system.web>
  <authorization>
 	 <allow roles="subscriber" />
 	 <deny users="*" />
  </authorization>
	</system.web>
</configuration>

وبالنسبة لكود ملف WEB.CONFIG الرئيسي الموجود على الدليل الرئيسي ، قم بتعديله كالآتي :

<configuration>
	<system.web>
.
.
.

  <authentication mode="Forms">
 	 <forms name=".YOURPROJECTAUTH" loginUrl="login.aspx" protection="All" path="/" />
  </authentication>
  <authorization>
 	 <allow users="*" />
  </authorization>
.
.
.

	</system.web>
</configuration>

الآن في صفحة الدخول نفترض عندك زر اسمه LIOGIN مثلا وكذلك CHECKBOX لتذكر البيانات مستقبلا وحقلي اسم وكلمة مرور ، الكود التالي يوضع في حدث الضغط على الزر LOGIN

 If Page.IsValid Then
            If NameTextBox.Text = "1" And PasswordTextBox.Text = "1" Then
                Dim UserRole As String = "subscriber" 'أو تجلب الرول من قاعدة البيانات بدلالة الاسم مثلاً
                If UserRole Is Nothing Then
                Else
                    BookTicket(NameTextBox.Text, UserRole, ChkBxRememberMe.Checked)
                End If
            End If
        End If

وهذا هو الإجراء BookTicket

 Private Sub BookTicket(ByVal UserName As String, ByVal Role As String, ByVal IsPersistent As Boolean)
        Dim UserTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddDays(10), IsPersistent, Role, FormsAuthentication.FormsCookiePath)
        Dim CookieHash As String = FormsAuthentication.Encrypt(UserTicket)
        Dim UserCookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, CookieHash)
        If UserTicket.IsPersistent Then
            UserCookie.Expires = UserTicket.Expiration
        End If
        Response.Cookies.Add(UserCookie)
        Response.Redirect(Request.QueryString("ReturnUrl"))
    End Sub

بقي شيء هام ، في ملف GLOBAL ادخل منطقة الكود وفي الحدث Application_AuthenticateRequest ضع الكود التالي :

        If (Not (HttpContext.Current.User Is Nothing)) Then
            If HttpContext.Current.User.Identity.IsAuthenticated Then
                If HttpContext.Current.User.Identity.AuthenticationType = "Forms" Then
                    Dim Id As FormsIdentity = HttpContext.Current.User.Identity
                    Dim UserTicket As FormsAuthenticationTicket = Id.Ticket
                    Dim UserData As String = UserTicket.UserData
                    Dim Roles() As String = UserData.Split(",")
                    HttpContext.Current.User = New System.Security.Principal.GenericPrincipal(Id, Roles)
                End If
            End If
        End If

الآن أصبح لديك نظام متعدد المستخدمين والمناطق ، أضف ما يحلو لك في كل منطقة ولن يدخل هذه المنطقة سوى المخول له الدخول إليها فقط ، حتى وإن كان مسجل الدخول بمستوى غير مستواه فسيتم تحويله لصفحة الدخول

طبعا هذه عجالة سريعة جداً ، وربما تجد أخطاء في الأكواد ، ولكن هذا ما تيسر من وقت الآن فأرجو أن ينفعك الله به والإخوان

#6

أخواني شكرا جزيلا لكم و لكن هل بالأمكان عمل مشروع صغير لهذه العملية ارجوكم و ارساله في المرفقات لانه يظهر لي اخطاء كثيرة عند التنفيذ و ذلك بسبب قلة خبرتي على ما اظن فهل من مغيث لاني محتاجه ضروري جدا!!!!!!!!!!!!!

#7

انا جربت الكود الأول و كان يحدث خطأ و هو

Parser Error Message: This is an unexpected token. Expected 'NAME'. Line 27, position 62.

Source Error:

<authentication mode="Forms" />

<forms name="d1auth" loginurl="login.aspx" protection="All"</forms>

و لذلك اطلب من الاخوان عمل مشروع بسيط يحتوي على صفحتين فقط و هما

1-login.aspx

حيث تحتوي على textbox1 لأدخال اسم المستخدم و textbox2 لكلمة المرور و command buttton للحدث .

2- showservice.aspx هذي الصفحة الثانية التي لا يستطيع الدخول اليها الا المشتركين و الذين قامو بادخال كل من اسم المستخدم و كلمة المرور في الصفحة السابقة login .

و للتبسيط اكثر ليكن الأشخاص الذين تقبل كل من اسمائهم و كلمات السر التي تخصهم هي

1- username :- ahmed pass :- 123456

2- username :- majed pass :- 789321

و الان ارجو منكم المساعدة لان الموضوع على ما اعتقد هام جدا و مفيد و انا بالانتظار و ترقبوا مني تنزيل كتب asp.net using vb code قريبا............................

#8

السلام عليكم

تفضل

وحتى تفهم الكود راجع كلامي السابق بتأن

ProtectedArea.rar

#9

السلام عليكم

جزاكم الله خيرا اخى محمد

{وَاتَّقُواْ يَوْمًا تُرْجَعُونَ فِيهِ إِلَى اللّهِ ثُمَّ تُوَفَّى كُلُّ نَفْسٍ مَّا كَسَبَتْ وَهُمْ لاَ يُظْلَمُونَ} (281) سورة البقرة

br17.gif

برنامج الإتصلات الإدارية والارشيف الالكتروني

برنامج الخبير لنقاط البيع المباشرة

#10

مشكور اخ محمد والله من غيرك ما ادري شو اسوي مشكور ;)

تم تعديل هذه المشاركة بواسطة moh1983 في 4 نوفمبر 2005 في 15:56

#11

وعليكم السلام

و جزاكم الله خيراً

#12

السلام عليكم

هذا الخطأ يظهر عندما تكون صفحة login.aspx هي ال set as start page

Object reference not set to an instance of an object

Response.Redirect(Request.QueryString("ReturnUrl"))

و عندما تكون set as start page صفحة showservice.aspx لا يعطيني اي خظأ هل هذا بسبب الباراميتر الخاص ب URL الذي يمرر للصفحة login.aspx و عدم وجوده فيها عندما تكون AS START PAGE

حاولت ان اعمل هذا الكود في صفحة LOGIN.ASPX في ال FORMLOAD وهو :-

IF NOT ISPOSTBACK THEN

RESPONSE.REDIRECT("MEMBER\SHOWSERVICE/ASPX")

END IF

و لكن عند التنفيذ يعطي ما يشبه INFINITIVE LOOP لا يذهب لأي صفحة هل من حل

و هذا هو الباراميتر الذي اقصده

http://localhost/ProtectedArea/login.aspx?...howservice.aspx

تم تعديل هذه المشاركة بواسطة moh1983 في 4 نوفمبر 2005 في 20:20

#13

وعليكم السلام ورحمة الله

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

        If Not Request.QueryString("returnurl") Is Nothing Then
            Response.Redirect(Request.QueryString("returnurl"))
        Else
            Response.Redirect("default.aspx")
        End If

تلاحظ هنا انه في حالة كان هذا المتغير غير موجود فإنه سيتم تحويلك إلى الصفحة الرئيسية ولن يظهر هذا الخطأ بإذن الله تعالى

وفقك الله للخير

#14

السلام عليكم

اخ محمد وضعت الكود اللي اعطيتني اياه في صفحة login.aspx في formload و لكن هناك ايضا مشكلة و هي عند عمل run من صفحة login.aspx يذهب المستعرض الى صفحة default.aspx و عند الكبس على الرابط الموجود في هذه الصفحة member area الذي من شأنه ان يذهب بك الى هذا ال URL " http://localhost/test/members/showservice.aspx

لا يظهر شيء اي PAGE CANT BE DESPLAY

انا اعرف اني اثقلت عليك و لكني اشكرك على كل شي قمت به

#15

وعليكم السلام

الكود أخي الفاضل لا تضعه في حدث تحميل الصفحة

اسمح لي لن أقول لك أين :)

يجب أن تحاول ، حتى تفهم وتتعلم

والأمر سهل بإذن الله تعالى

#16

أشكرك يا أستاذ محمد النحراوي على هذا المثال الطيب و جعله الله في ميزان حسناتك ان شاء الله فقد كنت أبحث عن كود مماثل منذ فترة

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#17

اللهم آمين ، وجزاك الله خيراً أخي الكريم

#18

فعلا لا اعرف كيف اشكرك و قد عملت كثيرا حتى عرفت المكان المناسب له و هو في Private Sub BookTicket

و لكن اليس من المفروض عند ادخال اسم المستخدم و كلمة المرور الذهاب الى الصفحة showservice.aspx بدلا من default.aspx ثم الضغظ على member area ثم الانتقال الى showservice.aspx ارجو ان تكون الفكره قد وصلت

و ارجو منك يا اخ محمد ان تعطيني طرف خيط لأمسك به و اعرف الحل بأذن الله :)

تم تعديل هذه المشاركة بواسطة moh1983 في 5 نوفمبر 2005 في 05:02

#19

:) أليس هكذا أفضل ؟

نعم هذا صحيح استبدل السطر

Response.Redirect(Request.QueryString("returnurl"))

بالكود :

If Not Request.QueryString("returnurl") Is Nothing Then
           Response.Redirect(Request.QueryString("returnurl"))
       Else
           Response.Redirect("default.aspx")
       End If

وفقني الله وإياك لكل خير

#20

لقد قمت بتعديل المشاركة ارجو التعليق

#21

لا بأس عرفت الحل و هو

If Not Request.QueryString("returnurl") Is Nothing Then

Response.Redirect(Request.QueryString("returnurl"))

Else

Response.Redirect("members\showservice.aspx")

End If

#22

اخ محمد اذا ما زلت موجودا

لنفرض ان اسماء المستخدمين و كلمات الدخول يتم قرائتها من قاعدة بيانات sql server 2000 و اليك التفاصيل :-

table name :- users

1- user_n

2-user_p

فسيكون هناك تعديل في زر الحدث اكيد و قد قمت بتعديله كما يلي بأستخدام sql command wizard و اسميته ocmd و عملت التالي :-

 With OCMDLOGIN

           

            .Parameters("@User_n").Value = NameTextBox.Text
            .Parameters("@user_p").Value = PasswordTextBox.Text
            .Connection.Open()

            If CStr(.ExecuteScalar) = "" Then
            
                LBLERROR.Visible = True
                .Connection.Close()
Else
Dim UserRole As String = "Member" 'أو تجلب الرول من قاعدة البيانات بدلالة الاسم مثلاً
                If UserRole Is Nothing Then
                Else
 BookTicket(NameTextBox.Text, UserRole, ChkBxRememberMe.Checked)

                End If
end with

و لكن ظهر لي بعض الأخطاء فهل من حل اخ محمد و انا اعرف انا الحل هو بأستخدام disconnected sql command "hard code"

و لكن كيف

#23

هل هناك حل

#24

لا تغفل كود الاخ محمد حسين فلقد أوضح هذه النقطة

Dim com As New SqlClient.SqlCommand
       Dim ob As Object
       com.Connection = CON
       com.CommandText = "select userid from users where user_username=@un and user_password=@pass"
       com.Parameters.Add("@un", TextBox1.Text)
       com.Parameters.Add("@pass", TextBox2.Text)
       CON.Open()
       ob = com.ExecuteScalar()
       CON.Close()
       If Not ob Is Nothing Then
           ..........................
       Else
           Response.Write("Invalid username or password")
       End If

طبعا لن ندخل في مسألة ال SQL INJECTION الآن حتى لا نعقد الأمور

تم تعديل هذه المشاركة بواسطة محمد النحراوي في 5 نوفمبر 2005 في 05:46

#25

لقد قمت بهذه الخطوة :-

Dim ocon As New SqlClient.SqlConnection()
                ocon.ConnectionString = "server=(local);database=servuice;trusted_connection=yes"
 Dim ocmdlogin  As New SqlClient.SqlCommand()
With ocmdlogin
     .CommandText = "select user_n from user where user_n =" & NameTextBox.text & "" 
.CommandText = "select user_p from user where user_p =" & PasswordTextBox.text & "" 


                    .Connection.Open()
 If CStr(.ExecuteScalar) = "" Then
lblerror.visible=true
else
 Dim UserRole As String = "Member"
                If UserRole Is Nothing Then
 BookTicket(NameTextBox.Text, UserRole, ChkBxRememberMe.Checked)

                End If

و لكن ما زال هناك أخطاء فأين السبب و لماذا هل هو في تنفيذ .commandtext في جملة select ؟؟؟؟؟ ام هناك سبب اخر لا اعرفه :wacko:

هذا الموضوع مغلق.

مواضيع مشابهة