PDA

View Full Version : آموزش : تشخیص هویت بوسیله دیتابیس اکسس



my_blithe
یک شنبه 02 دی 1386, 12:11 عصر
با سلام

با توجه به اینکه اکثر افراد تازه کار با سیستم تشخیص هویتی که توسط ویزارد VWD ساخته میشه وقتی که روی سرور قرار می گیره با مشکل بر می خورن این آموزش رو گذاشتم. که توسط اکسس سیستمی شبیه به همونی که ویزارد میسازه تحویل میده.
خوب برای شروع ابتدا باید یک جدول توی دیتابیس اکسس بسازید که شامل دو تا ستون یکی برای username و یکی برای password نام ستون اول رو uid و نام ستون دوم که پسورد
هست رو pwd میگذاریم و uid رو نیز primary key در نظر میگیریم .
خوب حالا این جدول رو به نام tbl_members ذخیره می کنیم .


حالا میریم سراغ ویژوال استودیو دات نت
و یک فرم به صفحه اضافه کنید به نام default
یک فرم دیگه هم به نام login
و حالا وارد فایل وب کانفیگ ( web.config ) شوید ; دوستانی که از نسخه 2005 استفاده می کنند باید این فایل رو به پروژه اضافه کنند ( وارد منوی فایل و سپس از add new item شده و یک فایل webconfig اضافه کنید )
خوب تنظیمات داخل وب کانفیگ به صورت زیر است ( کافیه محتویات داخل فایلتون رو کامل پاک کنید و کد های بنده رو جایگزینش کنید )


<?xml version="1.0"?>
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="MyAppCookie" loginUrl="login.aspx" protection="All" timeout="30" defaultUrl="default.aspx">
<credentials passwordFormat="Clear">
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20"/>
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
<compilation debug="true">
<assemblies>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>
</configuration>


خوب حالا فایل رو ذخیره کنید و بریم سراغ صفحه login.aspx که ساخته بودید بروید
در اینجا باید یک لوگین بسازید به این صورت :
یک تکس باکس برای وارد کردن username بگذارید و آی دی اونو txt_uid بگذارید
یک تکس باکس دیگه هم برای پسوورد که آی دی اونم txt_pwd گذاشتید و text mode رو برابر password تععین کنید
یک چک باکس برای بخاطر ماندن به نام chk_member
و یک لیبل برای خطا به نام lbl که Visible اون false هست
خوب حالا باید یک باتن هم برای ورود بگذارید آی دی اونو btn_submit میگذاریم :
کد های html به این صورت در میاد :

<table border="0" style="width: 100%; height: 504px">

<tr>
<td align="center" style="width: 100%">
<fieldset style="width: 296px; height: 112px" dir="rtl">
<legend dir="rtl">ورود به سایت</legend>
<table border="0">
<tr>
<td style="width: auto">
نام کاربری :</td>
<td align="right" style="width: auto">
<asp:TextBox ID="txt_uid" runat="server" Width="144px"></asp:TextBox></td>
<td style="width: auto">
</td>
</tr>
<tr>
<td style="width: auto">
رمز عبور :</td>
<td align="right" style="width: auto">
<asp:TextBox ID="txt_pwd" runat="server" TextMode="Password" Width="144px"></asp:TextBox></td>
<td style="width: auto">
</td>
</tr>
<tr>
<td colspan="2">
<asp:CheckBox ID="chk_member" runat="server" Text="مرابه خاطر بسپار" /></td>
<td style="width: auto">
</td>
</tr>
<tr>
<td colspan="3" style="width: auto">
<asp:Label ID="lbl" runat="server" ForeColor="Red" Text="نام کاربری یا رمز عبور نادرست می باشد"
Visible="False"></asp:Label></td>
</tr>
<tr>
<td style="width: auto">
</td>
<td align="center" style="width: auto">
<asp:Button ID="btn_submit" runat="server" CssClass="button" Text="ورود" /></td>
<td style="width: auto">
</td>
</tr>
</table>
</fieldset>
</td>
</tr>
</table>

حالا به سراغ بخش code-behind رفته و دو فضا نام زیر رو وارد نمایید


Imports System.Data
Imports System.Data.OleDb

خوب حالا بر روی باتن submit کلیک کنید دا رویداد مربوط به کلیک شدن این باتن ظاهر شود و کد های زیر رو داخلش بنویسید :


Imports System.Data
Imports System.Data.OleDb
Public Class login
Inherits System.Web.UI.Page
Protected Sub btn_submit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_submit.Click
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\App_Data\member.mdb") 'شی اتصال رو به همراه رشته اتصال تعریف میکنیم دقت کنید که دیتابیس اکسس داخل درایو دی قرار داره
Dim cmd As New OleDbCommand("select count(*) from tbl_members where uid=? and pwd=?", con) ' شی فرمان به همراه رشته تقاضا که یک دستور سلکت ساده هست رو تعیین کردم
cmd.Parameters.Add("uid", OleDbType.VarChar) 'پارامتر مربوط با نام کاربری رو پاس کردم
cmd.Parameters.Add("pwd", OleDbType.VarChar) 'پارامتر مبوط با رمز عبور رو پای کردم
con.Open() ' اتصال رو بر قرار می کنم
' اگر تعداد سطر های موجود در جدول که نام کاربری و رمز عبوری این چنین داشتن برابر یک بود
If cmd.ExecuteScalar = 1 Then
FormsAuthentication.RedirectFromLoginPage(txt_uid. Text, chk_member.Checked)
ElseIf cmd.ExecuteScalar = 0 Then 'اگر تعداد سطر های موجود در جدول که نام کاربری و رمز عبوری این چنین داشتن برابر صفر بود
lbl.Visible = True
End If 'پایان شرط
End Sub
End Class


حال اگه شما صفحه default.aspx رو فراخوانی کنید میبینید که ابتدا وارد صفحه لوگین شده و اگر تصدیق هویت صحیح بود آنگاه به صفحه default وارد میشه .

به همین راحتی.
منتظر ادامه مطلب هم باشد(سوالات متداول).
از بچه های شرکت فراداده هم به خاطر کمکی که به من کردن تشکر می کنم.

khz-web1
یک شنبه 02 دی 1386, 15:28 عصر
آقا واقعا ازت ممنونم اگه اینو به صورت PDF میزاشتی بهتر بود

merlin_vista
یک شنبه 02 دی 1386, 16:14 عصر
برای دکمه : SignOut :

FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
++
]چند سوال در باب این موضوع :
1 - چگونه نام کاربر وارد شده را در همه صفحات بگیریم !! حال اگر این نام از یک فیلد جدا در جدول باشد چی ؟

2 - چگونه بعضی از صفحات را از تشخیص هویت منع کنیم (یعنی آزاد باشه )

3 - چگونه اطلاعات دیگر فیلد های جدول members را در هرجایی که لازم است فرخانی کنیم !! مثل (تحصیلات و زمان آخرین ورود و . . . )


4- چگونه این عمل را برای پوشه خاط انجام بدیم یعنی این صفحات محافظت شده را در یک پوشه قرار بدیم و هرچه در آن پوشه هست اعتبار سنجی کنیم !!

بازم ممنون

khz-web1
یک شنبه 02 دی 1386, 16:54 عصر
آقا من هم به مشکل بر خوردم

شما گفتید که فایل web.config رو کامل پاک کنید و جاش کد های مربوط به کانفیگ شمارو بزرام ، ولی حالا که پاک می کنم و کدهای شمارو میزارم 29 ارور به من میده !!!!!!!

من نیاز شدید دارم به این برنامه اگه میشه سریع تر جواب بدید

merlin_vista
یک شنبه 02 دی 1386, 18:54 عصر
شما میتوانید به وب.کانفیگ خودتون فقط این قسمت را اضافه کنید :

<authenticationmode="Forms">
<formsname="MyAppCookie"loginUrl="login.aspx"protection="All"timeout="30"defaultUrl="default.aspx" >
<credentialspasswordFormat="Clear">
</credentials>
</forms>
</authentication>

hamid58
یک شنبه 02 دی 1386, 20:13 عصر
اینجا هم یک مقاله خوب هست :

Using the Microsoft Access Providers to Replace the Built-In SQL Server Providers (http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=404)

khz-web1
یک شنبه 02 دی 1386, 20:14 عصر
آقا من این فایل رو در زیر ضمیه کردم ، اگه واسم درستش کنید ممنون میشم

http://downloadahwaz.persiangig.com/asp/website15.zip

با تشکر

merlin_vista
دوشنبه 03 دی 1386, 08:42 صبح
آقا من از کد زیر برای تشخیص هویت استفاده کردم و کار داد !!
حالا میخواهم یک صفحه تشخیص هویت نداشته باشه بهم کار نداد ؟؟؟؟

<location path="download.aspx" ></location>
<system.web>
<authentication mode="Forms">
<forms name="MyAppCookie" loginUrl="Login.aspx" protection="All" timeout="30" defaultUrl="Default.aspx" >
<credentials passwordFormat="Clear">
</credentials>
</forms>
</authentication>

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

my_blithe
دوشنبه 03 دی 1386, 22:38 عصر
سلام
من کدها رو اصلاح کردم و توی پست اول همین تایپک اعمال شده می تونید لذت ببرید

merlin_vista
دوشنبه 03 دی 1386, 23:04 عصر
برای دکمه : SignOut :

FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();++
]چند سوال در باب این موضوع :
1 - چگونه نام کاربر وارد شده را در همه صفحات بگیریم !! حال اگر این نام از یک فیلد جدا در جدول باشد چی ؟

2 - چگونه بعضی از صفحات را از تشخیص هویت منع کنیم (یعنی آزاد باشه )

3 - چگونه اطلاعات دیگر فیلد های جدول members را در هرجایی که لازم است فرخانی کنیم !! مثل (تحصیلات و زمان آخرین ورود و . . . )


4- چگونه این عمل را برای پوشه خاط انجام بدیم یعنی این صفحات محافظت شده را در یک پوشه قرار بدیم و هرچه در آن پوشه هست اعتبار سنجی کنیم !!

بازم ممنون

کسی نیست جواب من را بده ؟ :گریه:

my_blithe
سه شنبه 04 دی 1386, 14:42 عصر
سوالات متداول :

صفحه ای به نام home.aspx و صفحه ای به نام members.aspx دارم میخوام وقتی صفحه home رو فراخاونی میکنم به صفحه لوگین نره ولی وقتی صفحه members رو فراخوانی کردم بره به صفحه لوگین بعد وارد این صفحه شه چی کار باید انجام بدم ؟
جواب : فایل وب کانفیگ رو به صورت زیر تغغیر بدید




<?xmlversion="1.0"?>
<configuration>

<system.web>

<customErrorsmode="Off"/>

<authenticationmode="Forms">
<formsname="MyAppCookie"loginUrl="login.aspx"protection="All"timeout="30"defaultUrl="default.aspx" >
<credentialspasswordFormat="Clear">
</credentials>
</forms>
</authentication>
<!--
<authorization>
<deny users="?"/>
</authorization>

-->

<sessionStatemode="InProc"stateConnectionString="tcpip=127.0.0.1:42424"sqlConnectionString="data source=127.0.0.1;user id=sa;password="cookieless="false"timeout="20"/>

<globalizationrequestEncoding="utf-8"responseEncoding="utf-8"/>

<compilation>
<assemblies>
<addassembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>

<locationpath="home.aspx">
<system.web>
<authorization>
<allowusers="*"/>
</authorization>
</system.web>
</location>

<locationpath="members.aspx">
<system.web>
<authorization>
<denyusers="?"/>
</authorization>
</system.web>
</location>

</configuration>









می خواهم بعد از تصدیق هویت نام کاربری رو در صفحه default در بیارم و یک پیام خوش آمد بدم چی کار کنم ؟

جواب : توسط متد زیر نام کاربری فرد لوگین شده رو بدست آورید :


User.Identity.Name.ToString



در صفحه ای که دارم از کجا بفهمم که کاربر لوگین کرده یا نه؟
جواب : توسط متد زیر میتونید بفهمید که کاربر لوگین شده یا خیر


If User.Identity.IsAuthenticated Then
'کاربر لوگین شده
Else
'کاربر لوگین نشده
End If





وقتی کاربر لوگین میکنه داخل سایت حالا چطور signout کنه؟در صفحه مثلا default یک باتن به نام btn_signout قرار بدید و کد های زیر رو بنویسید


Protected Sub btn_signout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_signout.Click

FormsAuthentication.SignOut()
FormsAuthentication.RedirectToLoginPage()

End Sub




کاربر هر چند وفت که داخل سیستم هست بطور خود کار signout میشه نمیدونم چرا ؟
جواب : شما در فایل وب کانفیگ در خط زیر


<authenticationmode="Forms">
<formsname="MyAppCookie"loginUrl="login.aspx"protection="All"timeout="30"defaultUrl="default.aspx" >
<credentialspasswordFormat="Clear">
</credentials>
</forms>
</authentication>




مقدار timeout="30" قرار دادید اونو بیشترش کنید . مثلا






<authenticationmode="Forms">
<formsname="MyAppCookie"loginUrl="login.aspx"protection="All"timeout="100"defaultUrl="default.aspx" >
<credentialspasswordFormat="Clear">
</credentials>
</forms>
</authentication>

my_blithe
چهارشنبه 05 دی 1386, 19:11 عصر
سلام این هم فایل آمده شده با این روش فقط هنگام اجرا دقت کنید که مسیر دیتابیس در رویداد دکمه صفحه login درس وارد شده باشه :

Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\App_Data\member.mdb")

موفق باشید.
تشکر یادتون نره:تشویق::بامزه:

mehran20_200
دوشنبه 28 بهمن 1387, 02:15 صبح
با سلام
دوستان این بحث بسیار با ارزش و مهم است.
اما اگه گفته نشه که چگونه همانند کنترل های asp.net بتوانیم profile وrols مختلفی ایجاد کنیم مطلب ناقص است.


1 - چگونه نام کاربر وارد شده را در همه صفحات بگیریم !! حال اگر این نام از یک فیلد جدا در جدول باشد چی ؟
3 - چگونه اطلاعات دیگر فیلد های جدول members را در هرجایی که لازم است فرخانی کنیم !! مثل (تحصیلات و زمان آخرین ورود و . . . )
4- چگونه این عمل را برای پوشه خاط انجام بدیم یعنی این صفحات محافظت شده را در یک پوشه قرار بدیم و هرچه در آن پوشه هست اعتبار سنجی کنیم !!
چرا هی پاسخی برای این سوال ها مشخص نشد؟:ناراحت:
با تشکر

my_blithe
دوشنبه 28 بهمن 1387, 19:07 عصر
سلام

نام کاربر رو از طریق کد زیر میشه بدست آورد (مثلا بریزیم توی لیبل 1) :


label1.text = User.Identity.Name.ToString


برای مورد دوم و سوم باید کد نویسی کنید و خودتون مقادیر رو توی دیتابیس بریزید و هر وقت خواستید بازیابی کنید.

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

komeil64
جمعه 23 مرداد 1388, 15:46 عصر
سلام
از مطالب خوبتون ممنون
من کد اصلی دکمه این کار رو به سی شارپ تبدیل کردم با کانورتور اما از کامندش ایراد می گیره
کد تبدیل شده به سی شارپ:


OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2005\\WebSites\\WebSite1\\App_Data\\member.mdb");
OleDbCommand cmd = new OleDbCommand("select count(*) from tbl_members where uid=? and pwd=?", con);
cmd.Parameters.Add("uid", OleDbType.VarChar);
cmd.Parameters.Add("pwd", OleDbType.VarChar);
con.Open();
if (cmd.ExecuteScalar == 1) {
FormsAuthentication.RedirectFromLoginPage(txt_uid. Text, chk_member.Checked);
}
else if (cmd.ExecuteScalar == 0) {
lbl.Visible = true;
}

از این دو مورد هم ایراد می گیره.با یک مساوی هم همین مشکل هست


cmd.ExecuteScalar == 1
cmd.ExecuteScalar == 0

komeil64
جمعه 23 مرداد 1388, 19:05 عصر
ممنون میشم راهنمایی کنین یا یه لاگین سی شارپ مثال بزنید
تشکر

milade
جمعه 23 مرداد 1388, 20:31 عصر
سلام استاد .
لطفاً تایپکهای قدیمیرو بالا نیار .
خب سال 86 کی زنده ...
اینو تست کن :

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2005\\WebSites\\WebSite1\\App_Data\\member.mdb");
OleDbCommand cmd = new OleDbCommand("select count(*) from tbl_members where uid=@ud and pwd=@pd", con);
cmd.Parameters.Add("@ud", OleDbType.VarChar);
cmd.Parameters.Add("@pd", OleDbType.VarChar);
con.Open();
if (cmd.ExecuteScalar == 1) {
FormsAuthentication.RedirectFromLoginPage(txt_uid. Text, chk_member.Checked);
}
else if (cmd.ExecuteScalar == 0) {
lbl.Visible = true;
}
البته من فقط کد رو اصلاح کردم ...
شما هم بهتره Command رو به DataReder وصل کنی و ریدر رو چک کنی ( میتونی هم این کار رو نکنی !!! )

پاینده باشید

komeil64
جمعه 23 مرداد 1388, 20:44 عصر
از راهنماییتون ممنون
بازم همون مشکل هست
میشه یه مثال از دیتاریدر بزارید
تشکر

oghab1
دوشنبه 27 دی 1389, 13:29 عصر
دوستان میشه لطف کنید کد #C این تاپیکم قرار دهید

ممنون میشم