PDA

View Full Version : گفتگو: آموزشی + ساخت لاگین



Mohandes2009
چهارشنبه 12 آبان 1389, 14:09 عصر
دوستان من هر چی گشتم بحث بدرد بخوری در رابطه با ساخت لاگین پیدا نکردم بیایین اینجا با هم بسازیم

1.لاگین به سایت
2.ثبت نام در سایت
3.بازیابی رمز عبور
4.تغییر رمز عبور

البته از چند نفری سوال کردم در این مورد از دوستان سایت برنامه نویس!((البته اگه تکراری هست و بحثی هست بگید من سریعاً پاک میکنم)) من چیزی ندیدم باشه

ابتدا پایگاه داده اونا تعریف کنیم هرجا اشتباه میکنم بگید تا ی چیز کامل درست بشه!

من فک میکنم دوتا Tabel می خواد که یکی برای مشخصات افراد و یکی برای نقش ها!

Tabel مشخصات : Id,UserName,Pass,Name,Family,Question,Answer,Email
و احیاناً فیلد های مورد نیاز دیگر
Tabel نقش ها : Id,Name,Rull

دوستان نظر بدن با ادامه اگه چیزی میدونند!

fa_karoon
چهارشنبه 12 آبان 1389, 14:17 عصر
سلام موضوع ساخت لاگین خوب یه چیز معلومه که قبلا بحثش زیاد مطرح شده، اما بیشتر بحث سر چک کردن Role افراد هنگام دسترسی به صفحات خاص هست
اینکه آیا Role رو در یک Session نگه داریم بعد سعی کنیم Session رو امن کنیم؟
یا اینکه از روش های دیگه مثل ایجاد یه جدول برای نگه داشتن Role افرادی که در حال حاضر لاگین کرده اند استفاده بشه ؟
درباره این روش ها بحث زیاد شده اما آخرش ما به نتیجه مشخصی نرسیدیم

z_bluestar
چهارشنبه 12 آبان 1389, 15:07 عصر
بهترین راه برای کنترل کردن کاربران و Role ها استفاده از RoleProvider خود Asp.net می باشد .

sam166
چهارشنبه 12 آبان 1389, 15:18 عصر
این بحث ها همه در تاپیک های دیگه ای مطرح شده و به نتیجه رسیده ولی نه نتیجه خیلی خوب
بیایید از اول یک ساختار کلی برای لاگین و بقیه مسائل مربوطش مطرح کنیم و شروع به کار کنیم
که اگر فرد تازه واردی وارد این مبحث شد خوشحال بشه و کارش راه بیفته.
اینم نظر بنده بود .حالا ببینیم بقیه اساتید چی میگن

z_bluestar
چهارشنبه 12 آبان 1389, 15:38 عصر
من فک میکنم دوتا Tabel می خواد که یکی برای مشخصات افراد و یکی برای نقش ها!

Tabel مشخصات : Id,UserName,Pass,Name,Family,Question,Answer,Email
و احیاناً فیلد های مورد نیاز دیگر
Tabel نقش ها : Id,Name,Rull

دوستان نظر بدن با ادامه اگه چیزی میدونند!

خوب بذارین اول جداول را اصلاح کنیم .
اگه بخواهیم یک ساختار ساده درست کنیم به جداول زیر احتیاج داریم:
جدول Role :
RoleID , RoleName ,RoleDesc

جدول User :
UserID , Username ,UserPass , UserEmail ,RoleID, Name , Family ,PasswordQuestion , PasswordAnsware , IsApprove , status, RegisterDate , LastLoginDate


UserID= شماره کاربر
Username = نام کاربری
UserPass = رمز کاربری
UserEmail = ایمیل کاربر
RoleID = شماره Role کاربر از جدول Role ها
Name = نام
Family = فامیلی
PasswordQuestion = سوال امنیتی
PasswordAnsware = پاسخ سوال امنیتی
IsApprove = تایید شده
status = فعال یا غیر فعال کردن کاربر
RegisterDate = تاریخ عضویت کاربر
LastLoginDate = تاریخ آخرین ورود کاربر به سیستم

RoleDesc توضیحی درباره اون Role خاص می باشد

درمورد Role Provider هم در این تاپیک و نحوه استفاده از اون رو می گم ولی ابتدا بذارید عضویت کامل شود دوباره Role Provider هم تو login گفته میشه.

سلام دوستان
خوب اجازه بدید از ایجاد کردن یک کاربر جدید شروع کرد

فرض کنید بر اساس جدولمون چنین فرمی رو آماده می کنیم

http://barnamenevis.org/attachment.php?attachmentid=59586&stc=1&d=1288814249

بعد اینکه کاربر فرم را پر کرد و دکمه Create User رو Click کرد حالا کد زیر رو می نویسیم

//Hash Password
string HashPassword = FormsAuthentication.HashPasswordForStoringInConfig File(Password.Text, "MD5");

//Insert Data in Database
//after Insert data in Database you can login User

FormsAuthentication.SetAuthCookie(UserName.Text, false /* createPersistentCookie */);


اولین کاری یکه می کنیم اینه که رمز عبور کاربر را کد می کنیم برای این کار من MDF رو پیشنهاد میدم چون غیر قابل بازگشته و شکسته نمیشه یعنی هر دفعه شما وقتی یک کلمه رو به MD5 تبدیل می کنید , همون عبارت می شود ولی غیر قابل بازگشته

از اونجایی که کاربر رمز عبور خود را می داند در هر ورود به سایت رمز عبور وارد شده توسط کاربر با این الگوریتم (MD5) کد می شود و با نمونه موجود در Database مقایسه می شود

و اگر کاربر رمز عبور خود را فراموش کند شما باید رمز عبور جدیدی جایگزین قبلی کنید و نمی توانید رمز عبور را به هیچ عنوان بازیابی کنید

بعد اینکه کاربر به Database اضافه شد می تونید از این متد کلاس FormsAuthentication برای login کردنش در سیستم استفاده کنید .

اولین پارامتر آن نام کاربر و پارامتر دوم آن یک مقدار bool است که آیا کاربر را به خاطر بسپارد یا نه ؟؟

برای استفاده از کلاس FormsAuthentication باید یکسری تغییرات در فایل web.config پروژه هم بدید

<authentication mode="Forms">
<forms name=".Authenticationmysite" loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" slidingExpiration="true" timeout="43200">
</forms>
</authentication>

fa_karoon
چهارشنبه 12 آبان 1389, 16:31 عصر
بهترین راه برای کنترل کردن کاربران و Role ها استفاده از RoleProvider خود ASP.NET می باشد .

می شه لطفا درباه RoleProvider بیشتر توضیح بدید؟ آخه یکی از اساتید ما هم گفته بود که بهتره از سیستم لاگین خود .Net استفاده کنید(که متاسفانه ترم تمام شد و ...)

pikoolas
چهارشنبه 12 آبان 1389, 16:35 عصر
می شه لطفا درباه RoleProvider بیشتر توضیح بدید؟ آخه یکی از اساتید ما هم گفته بود که بهتره از سیستم لاگین خود .Net استفاده کنید(که متاسفانه ترم تمام شد و ...)
این پست رو بخون
http://barnamenevis.org/forum/showthread.php?t=254874&page=2

raziee
پنج شنبه 13 آبان 1389, 09:33 صبح
وستان من هر چی گشتم بحث بدرد بخوری در رابطه با ساخت لاگین پیدا نکردم بیایین اینجا با هم بسازیم

1.لاگین به سایت
2.ثبت نام در سایت
3.بازیابی رمز عبور
4.تغییر رمز عبور

البته از چند نفری سوال کردم در این مورد از دوستان سایت برنامه نویس!((البته اگه تکراری هست و بحثی هست بگید من سریعاً پاک میکنم)) من چیزی ندیدم باشه

ابتدا پایگاه داده اونا تعریف کنیم هرجا اشتباه میکنم بگید تا ی چیز کامل درست بشه!

من فک میکنم دوتا Tabel می خواد که یکی برای مشخصات افراد و یکی برای نقش ها!

Tabel مشخصات : Id,UserName,Pass,Name,Family,Question,Answer,Email
و احیاناً فیلد های مورد نیاز دیگر
Tabel نقش ها : Id,Name,Rull

دوستان نظر بدن با ادامه اگه چیزی میدونند! بهترین راه استفاده از Membership خود دات نت هست.
البته نه دقیقا خود Membership دات نت ، بلکه در واقع بهترین راه توسعه ی Membership بر اساس نیاز/تجربه/دانش فردی و استفاده از اون.


مشکل لاگینش نیستا امنیتشه ... کی گفته برادر؟


چگونه میشود لاگین بدون کنترل های asp انجام داد و امنیت کامل برقرار کرد
ببین این کد ها بدردت میخوره؟
protected void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim().ToLower();
string password = txtPassword.Text;
bool isValid = false;
try
{
isValid = Membership.ValidateUser(userName, password);
}
catch (Exception ex) { Response.Write(ex.Message); }
if (isValid)
{
Authentication(txtUserName.Text, chkRemmeberMe.Checked);
}
else
{
litInvalidCredentialsMessage.Visible = true;
}
}


private void Authentication(string userName, bool rememberMe)
{
// Query the user store to get this user's User Data
string userDataString = String.Concat("Project.My", "|", userName);

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, rememberMe);

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);


// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
version: ticket.Version,
name: ticket.Name,
issueDate: ticket.IssueDate,
expiration: ticket.Expiration,
isPersistent: ticket.IsPersistent,
userData: userDataString
);

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt(newTicket);

authCookie.HttpOnly = true;

// Manually add the authCookie to the Cookies collection
Response.Cookies.Add(authCookie);

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl(userName, rememberMe);

Response.Redirect(redirUrl);
}
این ها رو ببینید:(منابع مفید:)



Dissecting Forms Authentication (http://www.4guysfromrolla.com/articles/072005-1.aspx)
Explained: Forms Authentication in ASP.NET 2.0 (http://msdn.microsoft.com/en-us/library/aa480476.aspx)
Securing Login Controls (http://msdn.microsoft.com/en-us/library/ms178346.aspx)
Understanding the Forms Authentication Ticket and Cookie (http://support.microsoft.com/kb/910443)




کسی می تونه درباره انواع authentication mode اطلاعاتی بده ؟
با توضیح مثلا کی از windowsو کی از formsو....؟

شما چهار تا راه داری:
یا استفاده از User های خود Windows
یا استفاده از Membership که در حالت Forms قرار داره.
یا برای کاربر مورد نظرت یک Passport درست کنی.
و یا اینکه Authentication رو بیخیال بشی و مقدار None رو در authentication mode انتخاب کنید.

z_bluestar
پنج شنبه 13 آبان 1389, 10:17 صبح
خوب برای Login سایت

http://barnamenevis.org/forum/attachment.php?attachmentid=59597&stc=1&d=1288854253

کد login :
if (Page.IsValid)
{
string HashPassword = FormsAuthentication.HashPasswordForStoringInConfig File(Password.Text, "MD5");

//Check User name and Pass Word In Database
//if Exist User

FormsAuthentication.RedirectFromLoginPage(UserName .Text, RememberMe.Checked);
//if doesn't have any ReturnUrl this method , returned user to Defualt Url in web.Config File "Default.aspx"

}

خوب حالا در هر صفحه ای از سایت که بخواهیم می توانیم نام کاربر را که اینجا داده ایم با این کد بدست بیاوریم .

//Check User name
string Username = HttpContext.Current.User.Identity.Name;

برای چک کردن اینکه آیا کاربری مثلا این صفحه را می بیند Login هست یا نه از کد زیر استفاده می کنیم.

bool AuthenticatedUser = HttpContext.Current.User.Identity.IsAuthenticated;
//true: User is Authenticated ,, false :User is Unauthenticated

sam166
پنج شنبه 13 آبان 1389, 17:02 عصر
من از طریق کتاب و نمونه برنامه تونستم این کد رو برای ورود به سایت بنویسم
البته یه ارور میده که در صدد حل کردنش هستم ولی گفتم بزارمش که شما تحلیلش کنید اگه به درد بخور هست روش کار کنم
البته ارورشم این هست
String was not recognized as a valid Boolean.

اینم خود کد اصلی

private string GetMemberRoleByID(string UID)
{
string connectionString1 = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Omid \Documents\Visual Studio 2010\WebSites\WebSite4\App_Data\omid.mdf;Integrate d Security=True;User Instance=True";
SqlConnection conObj = new SqlConnection(connectionString1);
string commandText = "select* from tbl_member(UID),values (@omid)";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
cmdObj.Parameters.AddWithValue("@omid",UID );
conObj.Open();
SqlDataReader dr = cmdObj.ExecuteReader();
string RetVal = "NA";
if (dr.Read())
{
RetVal = dr["Roles"].ToString();
}
conObj.Close();
return RetVal;

}
private bool GetMemberAuthenticate(string UID, string PWD)
{
string connectionString1 = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Omid \Documents\Visual Studio 2010\WebSites\WebSite4\App_Data\omid.mdf;Integrate d Security=True;User Instance=True";
SqlConnection conObj = new SqlConnection(connectionString1);
string commandText = "select* from tbl_members ";
SqlCommand cmdObj = new SqlCommand(commandText, conObj);
bool RetVal = false;
cmdObj.Parameters.AddWithValue("@aaa", UID);
cmdObj.Parameters.AddWithValue("@aaa1", PWD);
conObj.Open();
RetVal = Convert.ToBoolean(cmdObj.ExecuteScalar());
conObj.Close();
return RetVal;

}
protected void btnok_Click(object sender, EventArgs e)
{
if (GetMemberAuthenticate(txtusername.Text,txtpass.Te xt))
{
string role = GetMemberRoleByID(txtusername.Text);
FormsAuthenticationTicket AuthTicket = new FormsAuthenticationTicket(1, txtusername.Text, DateTime.Now, DateTime.Now.AddHours(1), false, role);
string encryptedTicket = FormsAuthentication.Encrypt(AuthTicket);
HttpCookie AuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(AuthCookie);

Response.Redirect(FormsAuthentication.GetRedirectU rl(txtusername.Text, chkRemmeberMe.Checked));
}
else
{
Label1.Visible = true;
}

}

mahmood1000
پنج شنبه 13 آبان 1389, 18:34 عصر
بهترین راه استفاده از Membership خود دات نت هست.
البته نه دقیقا خود Membership دات نت ، بلکه در واقع بهترین راه توسعه ی Membership بر اساس نیاز/تجربه/دانش فردی و استفاده از اون.

[/ltr]


دوست عزیز ا اینکه خود Membership کامل هست و استفاده ا راهت شکی نیست، مشکلی که این وسط برای من با استفاده از Membership افتاده اینه که وقتی از طریق ASPConfigoration دیتا بیس ساخته میشه با نام ASPNETDB در فولدر ASD_DAT ذخیره میشه و خیلی خوب و راحت هم کار میکنه، حالا اگر ما بخوایم از این دیتا بیس تو هاست استفاده کنیم نمیشه ، لااقل برا من نشد، اگرتنظیماتی باید انجام بدم راهنمایی کنید.
اگر راهی نداره از دوستان میخوام به کامل شدن این بحث کمک کنند چون مطمئنا خیلی از دوسان دیگه هم هستند که به این مطلب نیاز دارند.

با تشکر از همه

alonemm
جمعه 14 آبان 1389, 13:04 عصر
براي قسمت دسترسي كاربران Rol بايد يك جدول داشته باشيد كه دسترسي ها توش تعريف شده باشد.
و هر كاربر يك دسترسي ميگيره. مثل مدير سيستم - كاربر - كاربردائمي ....
حالا توي صفحات بر اساس اين دسترسي ميتونيد مشخص كنيد كه مثل نظرسنجي فقط براي كاربر دائمي كار كنه و يا ....

z_bluestar
جمعه 14 آبان 1389, 19:59 عصر
یه سوال از خانم z_bluestar داشتم:
ببخشید من نفمیدم کی و کجا اطلاعات کاربر ذخیره شد در پایگاه میشه بگید؟:لبخند:
و بعد از اینکه کاربر ثبت نام کرد چجوری میشه بهش یه میل زد و نام کاربری و رمز کاربری را براش فرستاد:لبخند:متشکرم

من جای کد Insert به Database رو خالی گذاشتم چون هر کی با روش خودش Data در دیتابیس Insert می کند .



//Hash Password
string HashPassword = FormsAuthentication.HashPasswordForStoringInConfig File(Password.Text, "MD5");


//1--Insert Data in Database
//inja user be database ezafe mishe :)

//2-Send Email



اگه بخواین عضویت کاربران در سایت بوسیله ایمیل انجام شود می تونید بعد از وارد کردن اطلاعات کاربر در Database فیلد Isapproved را False قرار بدهید و یک ایمیل فعال سازی برای کاربر ارسال کنید و در صورت کلیک بر روی لینک موجود در ایمیل کاربر را در سایت فعال کنید .

فقط فراموش نشود در صورت استفاده از این روش تا زمانی که فیلد Isapproved مساوی True نشده کاربر نتواند در سایت Login کند

Mohandes2009
شنبه 15 آبان 1389, 14:16 عصر
کد ارسال ایمیل هست به زبان vb منبع کد:
http://articles.sitepoint.com/article/sending-web-email-asp-net


<%@ Page Language="VB" EnableSessionState="False"
EnableViewState="False" Trace="False" Debug="False"%>
<%@ Import Namespace="System.Web.Mail" %>
<script language="VB" runat=server>

Sub Page_Load(Sender as Object, E as EventArgs)
If Page.IsPostBack Then
lblResponse.Text = "Your email has been sent."
End If
End Sub

Sub btn_Click(sender as Object, e as System.EventArgs)
If Request.Form("Email") <> "" Then
Dim objMail As New MailMessage()
objMail.From = "your_name@yourdomain.com"
objMail.To = Request.Form("Email")
objMail.Subject = Request.Form("Subject")
objMail.Body = Request.Form("Message")
objMail.BodyFormat = MailFormat.Text
SmtpMail.SmtpServer = " smtp.your-server.com"
SmtpMail.Send(objMail)
Else
lblResponse.Text = "Please enter an email address."
End If
End Sub

</script>
<html>
<head>
<style>
.main {font-family:Verdana; font-size:12px;}
.title {font-family:Verdana; font-size:18px; font-weight:bold;}
</style>
</head>
<body>
<span class="title" align="center">Send email from
an ASP.NET page</span>

<br><br><asp:Label class="main" id="lblResponse"
runat="server"/>

<form method="POST" name="MainForm" runat="server">
<table>
<tr>
<td class="main" align="right">Email:</td>
<td class="main"><input type="text"
class="main" name="Email" value=""></td>
</tr>
<tr>
<td class="main" align="right">
Subject:</td>
<td class="main"><input type="text"
class="main" name="Subject" value=""></td>
</tr>
<tr>
<td class="main" align="right"
valign="top">Message:</td>
<td class="main"><textarea name="Message"
cols="50" rows="8"></textarea></td>
</tr>


<tr>
<td class="main">&nbsp;</td>
<td class="main"><input type="Submit"
id="btnSubmit" OnServerClick="btn_Click" value="Send"
runat="server" /></td>
</tr>
</table>
</form>
</body>
</html>


اما نفهمیدم چجوری لینک فعال سازی ارسال کنم براش و بعد چجوری بفهمم کلیک کرده روی اون لینک!!:متفکر:میشه توضیح بدیدی یا با کد بگید.

mmnoody2006
شنبه 15 آبان 1389, 14:30 عصر
دوست عزیز لینک های فعال سازی کلا از یک روند استفاده می کنند
شما برای هر کاربر یه فیلد به هر نامی از نوع boolean یا در sql server که همون bit می شه میزاری
که مقدارش در حالت پیش فرض false می شه حالا از طریق لینک آدی کاربر رو هم می فرستی مثلا :
www.sitename.com/useractive/activer.aspx?userid=124 (http://www.sitename.com/useractive/activer.aspx?userid=124)
این مقدار 124 که آدی کاربر ماست رو به صفحه activer میفرسته در این صفحه روالی وجود داره که
از طریق کوئری استرینگ مقدار آی دی کاربر رو می گیره و فیلد مربوط به کاربر رو به true آپدیت می کنه

همین :قلب:

z_bluestar
شنبه 15 آبان 1389, 14:45 عصر
دوستان در مورد ایمیل فعال سازی قبلا خیلی بحث شده
چند تا لینک براتون گذاشتم:

http://barnamenevis.org/showthread.php?t=227404 (http://barnamenevis.org/showthread.php?t=227404&highlight=%D8%A7%DB%8C%D9%85%DB%8C%D9%84+%D9%81%D8 %B9%D8%A7%D9%84+%D8%B3%D8%A7%D8%B2%DB%8C)
http://barnamenevis.org/showthread.php?t=180928 (http://barnamenevis.org/showthread.php?t=180928&highlight=%D8%A7%DB%8C%D9%85%DB%8C%D9%84+%D9%81%D8 %B9%D8%A7%D9%84+%D8%B3%D8%A7%D8%B2%DB%8C)
http://barnamenevis.org/showthread.php?t=170289 (http://barnamenevis.org/showthread.php?t=170289&highlight=%D8%A7%DB%8C%D9%85%DB%8C%D9%84+%D9%81%D8 %B9%D8%A7%D9%84+%D8%B3%D8%A7%D8%B2%DB%8C)
http://barnamenevis.org/showthread.php?t=162936 (http://barnamenevis.org/showthread.php?t=162936&highlight=%D8%A7%DB%8C%D9%85%DB%8C%D9%84+%D9%81%D8 %B9%D8%A7%D9%84+%D8%B3%D8%A7%D8%B2%DB%8C)

باز نمونه های بیشتری تو اینترنت می تونید پیدا کنید

"دوستان لطفا اون پست هایی که احسای می کنید مطلب خاصی یا مفیدیدی رو در بر ندارند را حذف کنید تا برای دوستانی که می خوان بهدا این تاپیک رو بخونن
پیگیری مطالب ساده تر بشه " با تشکر :)

جلوگیری کردن از کاربران ناشناس(کسانی که Login نکرده اند ) از دیدن صفحاتی که نیاز به ورود به سایت دارن

برای این کار دو روش وجود دارد :
روش اول :

در Page_Load صفحه مورد نظر کد زیر را بنویسید
if (!HttpContext.Current.User.Identity.IsAuthenticate d)
FormsAuthentication.RedirectToLoginPage();

کاربر در اینجا به صفحه ای redirect میشه که شما به عنوان Login Page در فایل web.config معرفی کردید.
<authentication mode="Forms">
<forms name=".Authentication" loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" slidingExpiration="true" timeout="43200">
</forms>
</authentication>


روش دوم :

شما می توانید تمام صفحاتی که نیاز به Login دارند را در یک Folder در پروژه قرار داده و یک فایل web.Config هم به آن پوشه اضافه کنید و کد زیر را در آن بنویسید.

<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>


با این روش شما به کاربرانی که ناشناخته می باشند (کسانی که Login نکرده اند ) اجازه دیدن صفحات داخل آن folder را نمی دهید .

و اگر کاربری بدون Login بخواد صفحه ای را در داخل این Folder ببینه به صفحه Login
Redirect میشه .

mahmood1000
شنبه 15 آبان 1389, 17:17 عصر
خانم z_bluestar

امکانش هست که این دیتابیسی که آموزش دادید رو به همراه کداهاش تو اینجا اپلود کنید؟

ممنون میشم اگر که این لطف رو کنید.

با تشکر

این کدشه ، البته از استور پروسیجر استفاده کردم



using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Web.Configuration;
 
namespace login_by_barnamenevis
{
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void cmdCreateUser_Click(object sender, EventArgs e)
{
//Hash Password
string HashPassword = FormsAuthentication.HashPasswordForStoringInConfig File(txtPassword.Text, "MD5");
//ساخت رشته اتصال و ارتباط با وب کانفیگ
string connectionString = WebConfigurationManager.ConnectionStrings["ConnactionString"].ConnectionString;
//برقراری ارتباط
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("InsertUser", con);
//معرفی استور پروسیجر
cmd.CommandType = CommandType.StoredProcedure;
//معرفی اشیاء
cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
cmd.Parameters.AddWithValue("@UserPass",HashPassword);
cmd.Parameters.AddWithValue("@UserEmail", txtEmail.Text);
cmd.Parameters.AddWithValue("@FName", txtFName.Text);
cmd.Parameters.AddWithValue("@LName", txtLName.Text);
cmd.Parameters.AddWithValue("@PasswordQuestion", txtQuestion.Text);
cmd.Parameters.AddWithValue("@PasswordAnsware", txtAnswer.Text);
//درج مقادیر در تیبل
int added = 0;
try
{
con.Open();
added = cmd.ExecuteNonQuery();
Label1.Text = added.ToString() + " record inserted. ";
}
catch (Exception err)
{
Label1.Text = "Error :" + err.Message;
}
finally
{
con.Close();
}

}
}
}

z_bluestar
شنبه 15 آبان 1389, 21:58 عصر
امکانش هست این کد رو توضیح بدید؟

FormsAuthentication.RedirectFromLoginPage(UserName .Text, RememberMe.Checked);


این نام کاربری را در آن session یا cookie که در فایل Web.config معرفی کردید ذخیره می کند
پارامتر اول نام کاربر و پارامتر دوم یک مقدار bool هست که آیا نام کاربر را به خاطر بسپارد یا نه ؟؟؟


<authentication mode="Forms">
<forms name=".Authentication"

این یه نمونه کد ارسال ایمیل هست حالا یه روش دیگه هم هست که بعدا اون رو هم میگم :

System.Net.Mail.MailMessage Mail = new System.Net.Mail.MailMessage("myemail@site.com", "tothisemail@yahoo.com");
Mail.IsBodyHtml = true;
Mail.Body = "This is a test mail ";
Mail.Subject = "Activation mail alaki :D";

Mail.ReplyTo = new System.Net.Mail.MailAddress("myemail@site.com");
System.Net.Mail.SmtpClient newSmyp = new System.Net.Mail.SmtpClient("mail.site.com");
newSmyp.Credentials = new System.Net.NetworkCredential("myemail@site.com", "myemailpassword");
newSmyp.Send(Mail);

دوستان این نکته رو هم به خاطر داشته باشید تو کامپیوتر خودتون نمی تونید ایمیل ارسال کنید چون باید تنظیمات mail Server رو داشته باشه .

این کد رو می تونید روی هاست امتحان کنید

mahmood1000
شنبه 15 آبان 1389, 22:59 عصر
این نام کاربری را در آن session یا cookie که در فایل Web.config معرفی کردید ذخیره می کند
پارامتر اول نام کاربر و پارامتر دوم یک مقدار bool هست که آیا نام کاربر را به خاطر بسپارد یا نه ؟؟؟



<authentication mode="Forms">



<forms name=".Authentication"



از اینکه تا الان انقدر خوب راهنمایی کردید خیلی خیلی سپاس گذارم.
یه تقاضا داشتم.

من خیلی تو بحث session & cooki مشکل دارم، امکانش هست این پروژ رو که تا اینجا جلو آمدم و درسایت آپلود کنید؟ با تمامی امکاناتی که صحبت شده؟

:خجالت::خجالت::خجالت:

baran_mehr
یک شنبه 16 آبان 1389, 10:29 صبح
سلام به همه دوستان
یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!

z_bluestar
یک شنبه 16 آبان 1389, 11:54 صبح
سلام به همه دوستان
یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!

منظورتون از فیلد های خودش یا Database خودش چیه ؟؟؟
ما از Database که خودمون طراحی کردیم استفاده می کنیم

Mohandes2009
یک شنبه 16 آبان 1389, 12:51 عصر
سلام به همه دوستان
یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!
دوتا دیتا بیس بیشتر نداریم می تونی در صفحات اولیه ببینی!

یکی برای نقش ها یکی هم اطلاعات کاربران!

خانم مهندس یه سوال چجوری میشه یکی از فیلد های جدول User را آپدیت کرد بنظرتون بهتر نیست یک جدول به اسم status داشته باشیم تا بتونیم کاربر را بهتر غیر فعالش کنیم تو سایت؟

z_bluestar
یک شنبه 16 آبان 1389, 15:23 عصر
دوتا دیتا بیس بیشتر نداریم می تونی در صفحات اولیه ببینی!

یکی برای نقش ها یکی هم اطلاعات کاربران!

خانم مهندس یه سوال چجوری میشه یکی از فیلد های جدول User را آپدیت کرد بنظرتون بهتر نیست یک جدول به اسم status داشته باشیم تا بتونیم کاربر را بهتر غیر فعالش کنیم تو سایت؟

یه فیلد برای این کار داریم در جدول کاربران به پست 5 نگاه کنید
status = فعال یا غیر فعال کردن کاربر

هر کی بخواد میتونه Database رو متناسب با نیاز خودش طراحی کنه

Mohandes2009
یک شنبه 16 آبان 1389, 18:56 عصر
یه فیلد برای این کار داریم در جدول کاربران به پست 5 نگاه کنید
status = فعال یا غیر فعال کردن کاربر

هر کی بخواد میتونه Database رو متناسب با نیاز خودش طراحی کنه

بله دیدم این فیلدا موقع ثبت کاربر با مقدار true بر میگردونم بعدا اگه مدیر خواست اونا غیر فعال کنه! اما فک کردم جایی دیگه مشکل پیش بیاد و مثلا وقتی مدیر اگه false کرد دوباره بر گرده تو آپدیت ها و true بشه:متفکر:

z_bluestar
یک شنبه 16 آبان 1389, 20:27 عصر
بله دیدم این فیلدا موقع ثبت کاربر با مقدار true بر میگردونم بعدا اگه مدیر خواست اونا غیر فعال کنه! اما فک کردم جایی دیگه مشکل پیش بیاد و مثلا وقتی مدیر اگه false کرد دوباره بر گرده تو آپدیت ها و true بشه:متفکر:

یعنی چی ؟؟؟
خوب این فیلد فقط از پنل مدیریت Update می تواند شود .
می تونی یک sp بنویسی که نام کاربر را بگیرد و یک مقدار bit که در جدول کاربر را با این نام اگه پیدا کرد مقدار Status رو برابر با اون مقدار Bit (true یا False(
قرار دهد

mahmood1000
یک شنبه 16 آبان 1389, 21:58 عصر
شما می توانید تمام صفحاتی که نیاز به Login دارند را در یک Folder در پروژه قرار داده و یک فایل web.Config هم به آن پوشه اضافه کنید و کد زیر را در آن بنویسید.

<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>


با این روش شما به کاربرانی که ناشناخته می باشند (کسانی که Login نکرده اند ) اجازه دیدن صفحات داخل آن folder را نمی دهید .

و اگر کاربری بدون Login بخواد صفحه ای را در داخل این Folder ببینه به صفحه Login
Redirect میشه .

خانم z_bluestar
بازم سپاس گذارم، یه سوال دیگه داشتم.
من الان Login میکنم و هیچ مشکلی ندارم، حالا برای سطح دسترسی من یه تیبل به نام Role طبق روشی که گفتید ساختم،الان نمیدونم چطور میشه از طریق این تیبل سطح دسترسی رو معین کنم.

اگر راهنمایی کنید ممنون میشم.

با تشکر

Mohandes2009
یک شنبه 16 آبان 1389, 23:08 عصر
یعنی چی ؟؟؟
خوب این فیلد فقط از پنل مدیریت Update می تواند شود .
می تونی یک sp بنویسی که نام کاربر را بگیرد و یک مقدار bit که در جدول کاربر را با این نام اگه پیدا کرد مقدار Status رو برابر با اون مقدار Bit (true یا False(
قرار دهد

یعنی زمانی که من دارم یه کاربر را اد میکنم به جدول این فیلد هم جزء اون جدول هست و باید مقدار دهی بشه!! چجوری مقدار دهی نکنم مدیر فقط مقدار دهی کنه ؟ مگه میشه همچین چیزی؟:متفکر:

Himalaya
دوشنبه 17 آبان 1389, 02:47 صبح
یعنی زمانی که من دارم یه کاربر را اد میکنم به جدول این فیلد هم جزء اون جدول هست و باید مقدار دهی بشه!! چجوری مقدار دهی نکنم مدیر فقط مقدار دهی کنه ؟ مگه میشه همچین چیزی؟

یه کم بد متوجه شدی. ببین
وقتی یه کاربری ثبت نام میکنه این فیلد به صورت پیش فرض برای اون کاربر true میشه. این true پیش فرض توی دستور اینزرت وجود داره. یعنی همین که اکانت کاربر ایجاد شد ، همون لحظه فعال هم مشه و کاربر میتونه ازش استفاده کنه (تو این حالت احتیاجی به ایمیل فعال سازی نداره). حالا فرض کن به هر علتی این یوزر بعد از یه مدت میخواد غیر فعال بشه (مثلا به دلیل رعایت نکرد قوانین سایت) خوب اون کسی که یوزر رو غیر فعال میکنه کیه؟ خوب معلومه دیگه. مدیر سایت از طریق پنل مدیریت خودش این فیلد رو false میکنه و اون اکانت غیر فعال میشه. خود کاربر بعد از فعال شدن اکانتش نقشی تو فعال یا غیر فعال کردن مجدد اکانت خودش نداره



خانم z_bluestar
بازم سپاس گذارم، یه سوال دیگه داشتم.
من الان Login میکنم و هیچ مشکلی ندارم، حالا برای سطح دسترسی من یه تیبل به نام Role طبق روشی که گفتید ساختم،الان نمیدونم چطور میشه از طریق این تیبل سطح دسترسی رو معین کنم.
اگر راهنمایی کنید ممنون میشم.
با تشکر

البته سوالتون از من نبود ولی با این حال... تو حالتی که از جداول ممبر شیپ توی دیتابیس خودتون استفاده میکنید اول یه همچین RoleManager ای رو به فایل web.config اضافه میکنید


<roleManager defaultProvider="SqlProvider"
enabled="true"
cacheRolesInCookie="true"
cookieName=".ASPROLES"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All" >
<providers>
<add
name="SqlProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlServices"
applicationName="/" />
</providers>
</roleManager>

اون SqlServices اسم کانکشن استرینگی هست که تو فایل web.config تعریف شده و نشون میده رول مورد نظر رو چه دیتابیسی اعمال میشه
بعد موقع ایجاد یه یوزر Role مورد نظر رو برای اون یوزر تعیین میکنید. فرض کنید قراره یه کاربر نقش مدیریتی داشته یاشه. ستاره های پایین جهت یادآوریه تیکه کد زیر تو قسمتهای انتهای این پست هستش
***


if (!Roles.RoleExists("Admin"))
Roles.CreateRole("Admin");
Roles.AddUserToRole(UsernameTextbox.Text, "Admin");

ممبر شیپ از 2 تا جدول واسه نگهداری رولها و رولهایی که به کاربران داده شده استفاده میکنه
اولی جدول aspnet_Roles هستش که اسکریپت سازندش اینه


USE [MemberShip]
GO

/****** Object: Table [dbo].[aspnet_Roles] Script Date: 06/10/2010 15:03:58 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[aspnet_Roles](
[ApplicationId] [uniqueidentifier] NOT NULL,
[RoleId] [uniqueidentifier] NOT NULL,
[RoleName] [nvarchar](256) NOT NULL,
[LoweredRoleName] [nvarchar](256) NOT NULL,
[Description] [nvarchar](256) NULL,
PRIMARY KEY NONCLUSTERED
(
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[aspnet_Roles] WITH CHECK ADD FOREIGN KEY([ApplicationId])
REFERENCES [dbo].[aspnet_Applications] ([ApplicationId])
GO

ALTER TABLE [dbo].[aspnet_Roles] ADD DEFAULT (newid()) FOR [RoleId]
GO


و جدول aspnet_UsersInRoles که اسکریپت سازنده اون هم میشه این


USE [MemberShip]
GO

/****** Object: Table [dbo].[aspnet_UsersInRoles] Script Date: 06/10/2010 15:06:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[aspnet_UsersInRoles](
[UserId] [uniqueidentifier] NOT NULL,
[RoleId] [uniqueidentifier] NOT NULL,
PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[aspnet_UsersInRoles] WITH CHECK ADD FOREIGN KEY([RoleId])
REFERENCES [dbo].[aspnet_Roles] ([RoleId])
GO

ALTER TABLE [dbo].[aspnet_UsersInRoles] WITH CHECK ADD FOREIGN KEY([UserId])
REFERENCES [dbo].[aspnet_Users] ([UserId])
GO


3 خط کدی رو که زیر ستاره ها نوشتم که یادتون هست. وقتی دو خط اول اجرا میشه در صورتی که رول مورد نظر تو جدول aspnet_Roles وجود نداشته باشه ، اون رول ایجاد میشه و با اجرای خط سوم یه سطر هم یه جدول aspnet_UsersInRoles اضافه میشه که اون رول رو به کاربر مورد نظر اختصاص میده
بعد از این تو هر صفحه ای که خواستیم رول کاربری که لاگین کرده رو پیدا کنیم از این استفاده میکنیم
مثلا تو لود صفحه


if (User.IsInRole("MasterAdmin"))
{

}
else if (User.IsInRole("Admin"))
{

}
else
{
// Normal User
}


فعلا تا اینجاشو داشته باشید تا بعد

z_bluestar
دوشنبه 17 آبان 1389, 07:13 صبح
خانم z_bluestar
بازم سپاس گذارم، یه سوال دیگه داشتم.
من الان Login میکنم و هیچ مشکلی ندارم، حالا برای سطح دسترسی من یه تیبل به نام Role طبق روشی که گفتید ساختم،الان نمیدونم چطور میشه از طریق این تیبل سطح دسترسی رو معین کنم.

اگر راهنمایی کنید ممنون میشم.

با تشکر

اون رو هم میگم برای این کار از RoleProvider ها می تونیم استفاده کنیم و اون رو سفارشی کنیم برای خودمون

Himalaya
دوشنبه 17 آبان 1389, 09:51 صبح
اینم جهت سفارشی سازی RoleProvider


using System.Web.Security;
using System.Configuration.Provider;
using System.Collections.Specialized;
using System;
using System.Data;
using System.Data.Odbc;
using System.Configuration;
using System.Diagnostics;
using System.Web;
using System.Globalization;

/*

This provider works with the following schema for the tables of role data.

CREATE TABLE Roles
(
Rolename Text (255) NOT NULL,
ApplicationName Text (255) NOT NULL,
CONSTRAINT PKRoles PRIMARY KEY (Rolename, ApplicationName)
)

CREATE TABLE UsersInRoles
(
Username Text (255) NOT NULL,
Rolename Text (255) NOT NULL,
ApplicationName Text (255) NOT NULL,
CONSTRAINT PKUsersInRoles PRIMARY KEY (Username, Rolename, ApplicationName)
)

*/


namespace Samples.AspNet.Roles
{

public sealed class OdbcRoleProvider: RoleProvider
{

//
// Global connection string, generic exception message, event log info.
//

private string eventSource = "OdbcRoleProvider";
private string eventLog = "Application";
private string exceptionMessage = "An exception occurred. Please check the Event Log.";

private ConnectionStringSettings pConnectionStringSettings;
private string connectionString;


//
// If false, exceptions are thrown to the caller. If true,
// exceptions are written to the event log.
//

private bool pWriteExceptionsToEventLog = false;

public bool WriteExceptionsToEventLog
{
get { return pWriteExceptionsToEventLog; }
set { pWriteExceptionsToEventLog = value; }
}



//
// System.Configuration.Provider.ProviderBase.Initial ize Method
//

public override void Initialize(string name, NameValueCollection config)
{

//
// Initialize values from web.config.
//

if (config == null)
throw new ArgumentNullException("config");

if (name == null || name.Length == 0)
name = "OdbcRoleProvider";

if (String.IsNullOrEmpty(config["description"]))
{
config.Remove("description");
config.Add("description", "Sample ODBC Role provider");
}

// Initialize the abstract base class.
base.Initialize(name, config);


if (config["applicationName"] == null || config["applicationName"].Trim() == "")
{
pApplicationName = System.Web.Hosting.HostingEnvironment.ApplicationV irtualPath;
}
else
{
pApplicationName = config["applicationName"];
}


if (config["writeExceptionsToEventLog"] != null)
{
if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE")
{
pWriteExceptionsToEventLog = true;
}
}


//
// Initialize OdbcConnection.
//

pConnectionStringSettings = ConfigurationManager.
ConnectionStrings[config["connectionStringName"]];

if (pConnectionStringSettings == null || pConnectionStringSettings.ConnectionString.Trim() == "")
{
throw new ProviderException("Connection string cannot be blank.");
}

connectionString = pConnectionStringSettings.ConnectionString;
}



//
// System.Web.Security.RoleProvider properties.
//


private string pApplicationName;


public override string ApplicationName
{
get { return pApplicationName; }
set { pApplicationName = value; }
}

//
// System.Web.Security.RoleProvider methods.
//

//
// RoleProvider.AddUsersToRoles
//

public override void AddUsersToRoles(string[] usernames, string[] rolenames)
{
foreach (string rolename in rolenames)
{
if (!RoleExists(rolename))
{
throw new ProviderException("Role name not found.");
}
}

foreach (string username in usernames)
{
if (username.Contains(","))
{
throw new ArgumentException("User names cannot contain commas.");
}

foreach (string rolename in rolenames)
{
if (IsUserInRole(username, rolename))
{
throw new ProviderException("User is already in role.");
}
}
}


OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("INSERT INTO UsersInRoles " +
" (Username, Rolename, ApplicationName) " +
" Values(?, ?, ?)", conn);

OdbcParameter userParm = cmd.Parameters.Add("@Username", OdbcType.VarChar, 255);
OdbcParameter roleParm = cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255);
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcTransaction tran = null;

try
{
conn.Open();
tran = conn.BeginTransaction();
cmd.Transaction = tran;

foreach (string username in usernames)
{
foreach (string rolename in rolenames)
{
userParm.Value = username;
roleParm.Value = rolename;
cmd.ExecuteNonQuery();
}
}

tran.Commit();
}
catch (OdbcException e)
{
try
{
tran.Rollback();
}
catch { }


if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "AddUsersToRoles");
}
else
{
throw e;
}
}
finally
{
conn.Close();
}
}


//
// RoleProvider.CreateRole
//

public override void CreateRole(string rolename)
{
if (rolename.Contains(","))
{
throw new ArgumentException("Role names cannot contain commas.");
}

if (RoleExists(rolename))
{
throw new ProviderException("Role name already exists.");
}

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("INSERT INTO Roles " +
" (Rolename, ApplicationName) " +
" Values(?, ?)", conn);

cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

try
{
conn.Open();

cmd.ExecuteNonQuery();
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "CreateRole");
}
else
{
throw e;
}
}
finally
{
conn.Close();
}
}


//
// RoleProvider.DeleteRole
//

public override bool DeleteRole(string rolename, bool throwOnPopulatedRole)
{
if (!RoleExists(rolename))
{
throw new ProviderException("Role does not exist.");
}

if (throwOnPopulatedRole && GetUsersInRole(rolename).Length > 0)
{
throw new ProviderException("Cannot delete a populated role.");
}

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("DELETE FROM Roles " +
" WHERE Rolename = ? AND ApplicationName = ?", conn);

cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;


OdbcCommand cmd2 = new OdbcCommand("DELETE FROM UsersInRoles " +
" WHERE Rolename = ? AND ApplicationName = ?", conn);

cmd2.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd2.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcTransaction tran = null;

try
{
conn.Open();
tran = conn.BeginTransaction();
cmd.Transaction = tran;
cmd2.Transaction = tran;

cmd2.ExecuteNonQuery();
cmd.ExecuteNonQuery();

tran.Commit();
}
catch (OdbcException e)
{
try
{
tran.Rollback();
}
catch { }


if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "DeleteRole");

return false;
}
else
{
throw e;
}
}
finally
{
conn.Close();
}

return true;
}


//
// RoleProvider.GetAllRoles
//

public override string[] GetAllRoles()
{
string tmpRoleNames = "";

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT Rolename FROM Roles " +
" WHERE ApplicationName = ?", conn);

cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcDataReader reader = null;

try
{
conn.Open();

reader = cmd.ExecuteReader();

while (reader.Read())
{
tmpRoleNames += reader.GetString(0) + ",";
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetAllRoles");
}
else
{
throw e;
}
}
finally
{
if (reader != null) { reader.Close(); }
conn.Close();
}

if (tmpRoleNames.Length > 0)
{
// Remove trailing comma.
tmpRoleNames = tmpRoleNames.Substring(0, tmpRoleNames.Length - 1);
return tmpRoleNames.Split(',');
}

return new string[0];
}


//
// RoleProvider.GetRolesForUser
//

public override string[] GetRolesForUser(string username)
{
string tmpRoleNames = "";

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT Rolename FROM UsersInRoles " +
" WHERE Username = ? AND ApplicationName = ?", conn);

cmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcDataReader reader = null;

try
{
conn.Open();

reader = cmd.ExecuteReader();

while (reader.Read())
{
tmpRoleNames += reader.GetString(0) + ",";
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetRolesForUser");
}
else
{
throw e;
}
}
finally
{
if (reader != null) { reader.Close(); }
conn.Close();
}

if (tmpRoleNames.Length > 0)
{
// Remove trailing comma.
tmpRoleNames = tmpRoleNames.Substring(0, tmpRoleNames.Length - 1);
return tmpRoleNames.Split(',');
}

return new string[0];
}


//
// RoleProvider.GetUsersInRole
//

public override string[] GetUsersInRole(string rolename)
{
string tmpUserNames = "";

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT Username FROM UsersInRoles " +
" WHERE Rolename = ? AND ApplicationName = ?", conn);

cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcDataReader reader = null;

try
{
conn.Open();

reader = cmd.ExecuteReader();

while (reader.Read())
{
tmpUserNames += reader.GetString(0) + ",";
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetUsersInRole");
}
else
{
throw e;
}
}
finally
{
if (reader != null) { reader.Close(); }
conn.Close();
}

if (tmpUserNames.Length > 0)
{
// Remove trailing comma.
tmpUserNames = tmpUserNames.Substring(0, tmpUserNames.Length - 1);
return tmpUserNames.Split(',');
}

return new string[0];
}


//
// RoleProvider.IsUserInRole
//

public override bool IsUserInRole(string username, string rolename)
{
bool userIsInRole = false;

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT COUNT(*) FROM UsersInRoles " +
" WHERE Username = ? AND Rolename = ? AND ApplicationName = ?", conn);

cmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username;
cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

try
{
conn.Open();

int numRecs = (int)cmd.ExecuteScalar();

if (numRecs > 0)
{
userIsInRole = true;
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "IsUserInRole");
}
else
{
throw e;
}
}
finally
{
conn.Close();
}

return userIsInRole;
}


//
// RoleProvider.RemoveUsersFromRoles
//

public override void RemoveUsersFromRoles(string[] usernames, string[] rolenames)
{
foreach (string rolename in rolenames)
{
if (!RoleExists(rolename))
{
throw new ProviderException("Role name not found.");
}
}

foreach (string username in usernames)
{
foreach (string rolename in rolenames)
{
if (!IsUserInRole(username, rolename))
{
throw new ProviderException("User is not in role.");
}
}
}


OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("DELETE FROM UsersInRoles " +
" WHERE Username = ? AND Rolename = ? AND ApplicationName = ?", conn);

OdbcParameter userParm = cmd.Parameters.Add("@Username", OdbcType.VarChar, 255);
OdbcParameter roleParm = cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255);
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

OdbcTransaction tran = null;

try
{
conn.Open();
tran = conn.BeginTransaction();
cmd.Transaction = tran;

foreach (string username in usernames)
{
foreach (string rolename in rolenames)
{
userParm.Value = username;
roleParm.Value = rolename;
cmd.ExecuteNonQuery();
}
}

tran.Commit();
}
catch (OdbcException e)
{
try
{
tran.Rollback();
}
catch { }


if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "RemoveUsersFromRoles");
}
else
{
throw e;
}
}
finally
{
conn.Close();
}
}


//
// RoleProvider.RoleExists
//

public override bool RoleExists(string rolename)
{
bool exists = false;

OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT COUNT(*) FROM Roles " +
" WHERE Rolename = ? AND ApplicationName = ?", conn);

cmd.Parameters.Add("@Rolename", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;

try
{
conn.Open();

int numRecs = (int)cmd.ExecuteScalar();

if (numRecs > 0)
{
exists = true;
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "RoleExists");
}
else
{
throw e;
}
}
finally
{
conn.Close();
}

return exists;
}

//
// RoleProvider.FindUsersInRole
//

public override string[] FindUsersInRole(string rolename, string usernameToMatch)
{
OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand("SELECT Username FROM UsersInRoles " +
"WHERE Username LIKE ? AND RoleName = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@UsernameSearch", OdbcType.VarChar, 255).Value = usernameToMatch;
cmd.Parameters.Add("@RoleName", OdbcType.VarChar, 255).Value = rolename;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName;

string tmpUserNames = "";
OdbcDataReader reader = null;

try
{
conn.Open();

reader = cmd.ExecuteReader();

while (reader.Read())
{
tmpUserNames += reader.GetString(0) + ",";
}
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "FindUsersInRole");
}
else
{
throw e;
}
}
finally
{
if (reader != null) { reader.Close(); }

conn.Close();
}

if (tmpUserNames.Length > 0)
{
// Remove trailing comma.
tmpUserNames = tmpUserNames.Substring(0, tmpUserNames.Length - 1);
return tmpUserNames.Split(',');
}

return new string[0];
}

//
// WriteToEventLog
// A helper function that writes exception detail to the event log. Exceptions
// are written to the event log as a security measure to avoid private database
// details from being returned to the browser. If a method does not return a status
// or boolean indicating the action succeeded or failed, a generic exception is also
// thrown by the caller.
//

private void WriteToEventLog(OdbcException e, string action)
{
EventLog log = new EventLog();
log.Source = eventSource;
log.Log = eventLog;

string message = exceptionMessage + "\n\n";
message += "Action: " + action + "\n\n";
message += "Exception: " + e.ToString();

log.WriteEntry(message);
}

}
}

z_bluestar
دوشنبه 17 آبان 1389, 11:14 صبح
یک کلاس در پروژه تون ایجاد کنید
و اون رو Inherits کنید از کلاس RoleProvider
public class MySiteRoleProvider: System.Web.Security.RoleProvider
کلاس RoleProvider یک کلاس Abstract می باشد و شما باید یک سری از متدهاش رو پیاده سازی کنید برای این کار بر روی خط تیره زیر نام کلاس RoleProvider کلیک کرده و گزینه Implement abstract class System.Web.Security.RoleProvider
را انتخاب نمایید .

http://barnamenevis.org/attachment.php?attachmentid=59844&stc=1&d=1289203241

بعد از Implement کردن کلاس یک سری متد به آن اضافه می شه

public class MySiteRoleProvider: System.Web.Security.RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}

public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}

public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}

public override string[] GetAllRoles()
{
throw new NotImplementedException();
}

public override string[] GetRolesForUser(string username)
{
throw new NotImplementedException();
}

public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}

public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}

public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}

حالا ما می تونیم هر کدام از این متدها رو بر حسب نیازمون تغییر بدیم مثلا برای متد GetRolesForUser

public override string[] GetRolesForUser(string username)
{
string[] UserRolename=new string[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس
return UserRolename;
}

برای این کار یه تغییر هم باید در web.config بدهید
<system.web>
<roleManager defaultProvider="SiteRoleProvider" enabled="true">
<providers>
<clear/>
<add name="SiteRoleProvider" type="abcconstruct.Classes.MySiteRoleProvider"/>
</providers>
</roleManager>

abcconstruct.Classes نام name space کلاسم هست

حالا برای استفاده کردن از این می تونیم دو روش استفاده کنیم :
1- در web.config فولدری که می خواهین مثلا فقط برای کاربران admin قابل مشاهده باشد این را بنویسید :

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

یا در صفحه ای که می خواهید Role کاربر را چک کنید این کد را بویسید .
String[] Role = RoleProvider.GetRolesForUser(txtLUsername.Text);
if (Role[0] == "Company")
Response.Redirect("~/Customer/");
else
Response.Redirect("~/User/");

یا برای چک کردن این که آیا این کاربر دارای نقش مورد نظر هست یا نه ؟؟

bool IsinRole = HttpContext.Current.User.IsInRole("Administrator");

ارسال ایمیل :

using System;
using System.Web.Mail;
namespace SMTPAuthentication
{
public class SMTPAuthenticationExample
{
public static void SendMail()
{
string smtpServer = "mail.yourdomain.com";
string userName = "you@yourdomain.com";
string password = "YourMailboxPassword";
int cdoBasic = 1;
int cdoSendUsingPort = 2;
MailMessage msg = new MailMessage();
if (userName.Length > 0)
{
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25) ;
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort) ;
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", userName);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password);
}
msg.To = "someone@domain.com";
msg.From = "you@yourdomain.com";
msg.Subject = "Subject";
msg.Body = "Message";
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(msg);
}
}
}

Mohandes2009
سه شنبه 18 آبان 1389, 22:59 عصر
کلاس RoleProvider یک کلاس Abstract می باشد و شما باید یک سری از متدهاش رو پیاده سازی کنید برای این کار بر روی خط تیره زیر نام کلاس RoleProvider کلیک کرده و گزینه Implement abstract class System.Web.Security.RoleProvider
را انتخاب نمایید .


خط تیره کجاست؟ من نمی بینم!!:اشتباه:



برای این کار یه تغییر هم باید در web.config بدهید
<system.web>
<roleManager defaultProvider="SiteRoleProvider" enabled="true">
<providers>
<clear/>
<add name="SiteRoleProvider" type="abcconstruct.Classes.MySiteRoleProvider"/>
</providers>
</roleManager>

abcconstruct.Classes نام name space کلاسم هست

این کدای وب کانفیکا توضیح بدین!
abcconstruct.Classes منظورتون کدوم کلاسه؟:ناراحت:

من یه کلاس ایجاد کردم بنام Class2 و کدای شما را توش کپی کردم و بعد تو فایل وب کانفیک اونجایی که گفتید این کدایی که نوشتید را نوشتم!!:اشتباه:


حالا برای استفاده کردن از این می تونیم دو روش استفاده کنیم :
1- در web.config فولدری که می خواهین مثلا فقط برای کاربران admin قابل مشاهده باشد این را بنویسید :

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



نام فلدری که می خوایم فقط برای کاربران admin نمایش داده بشه Administrator است؟

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


ارسال ایمیل :

using System;
using System.Web.Mail;
namespace SMTPAuthentication
{
public class SMTPAuthenticationExample
{
public static void SendMail()
{
string smtpServer = "mail.yourdomain.com";
string userName = "you@yourdomain.com";
string password = "YourMailboxPassword";
int cdoBasic = 1;
int cdoSendUsingPort = 2;
MailMessage msg = new MailMessage();
if (userName.Length > 0)
{
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25) ;
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", cdoSendUsingPort) ;
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", userName);
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", password);
}
msg.To = "someone@domain.com";
msg.From = "you@yourdomain.com";
msg.Subject = "Subject";
msg.Body = "Message";
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(msg);
}
}
}
ببخشید باز سوال پیش اومد:لبخند: :
این خط کد ها یعنی چی؟
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
در ضمن حتما باید ایمیل روی دامین داشته باشیم؟ یعنی من جیمیل دارم نمی تونم استفاده کنم؟

اگه میشه طریقه استفاده اش چجوریه؟

Himalaya
چهارشنبه 19 آبان 1389, 00:31 صبح
سلام.


یعنی نام فلدرمون را به جای Administrator بنویسیم؟
نه اسم فولدر نیست. اسم یکی از رولهای تعریف شده هستش. یعنی کاربرایی که تو نقش مدیریتی هستن اجازه دارن



خط تیره کجاست؟ من نمی بینم!!
موس رو ببر رو کلمه قرمز رنگ یه خط زیر اون کلمه ظاهر میشه. اینجا نگفتم، منظورم تو ویژوال استودیو بود :لبخند:
شوخی کردم


public class MySiteRoleProvider: RoleProvider
تو پست 63 این کلاس رو به صورت کامل قرار دادم



abcconstruct.Classes منظورتون کدوم کلاسه؟
اون بنده خدا که گفته این namespace مربوط به کلاسشه


abcconstruct.Classes نام name space کلاسم هست
راستی خانوم z_bluestar چرا اینجا گفتید


public override string[] GetRolesForUser(string username)
{
string[] UserRolename=new string[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس
return UserRolename;
}
اول یه آرایه از نوع استرینگ که فقط یه عضو داره و مقداری رو که از دیتابیس گرفتید ریختید تو UserRolename[0] .. اگه قراره که فقط یه رول برگردونه که خوب اولا احتیاجی به آرایه نیست و با یه متغیر string کار راه میافته
و دوم اینکه لازمش اینه که هر کاربر فقط یه نقش داشته باشه . ولی ممکنه یه کاربر چند تا نقش هم داشته باشه (نه صرفا یه نقش) ضمن اینکه از اسم این تابع معلومه که ممکنه نقش این کاربر بیش از یکی باشه.
همه نقشهای این کاربر توسط ریدر از بانک خونده میشن و با کاما از هم جدا میشن و وقتی از ریدر اومدیم بیرون توسط تابع split نقشها رو تو قالب یه آرایه برمیگردونیم

mahmood1000
چهارشنبه 19 آبان 1389, 01:13 صبح
یک کلاس در پروژه تون ایجاد کنید
و اون رو Inherits کنید از کلاس RoleProvider
public class MySiteRoleProvider: System.Web.Security.RoleProvider
کلاس RoleProvider یک کلاس Abstract می باشد و شما باید یک سری از متدهاش رو پیاده سازی کنید برای این کار بر روی خط تیره زیر نام کلاس RoleProvider کلیک کرده و گزینه Implement abstract class System.Web.Security.RoleProvider
را انتخاب نمایید .


دوست عزیز میشه د رابطه با این کد توضیح بدید؟ چطور باید از db نقش کاربر رو بخونم؟

UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس

دوستان اگر کس دیگه هم میدونه لطفا کمک کنه


با تشکر

Mohandes2009
چهارشنبه 19 آبان 1389, 08:02 صبح
سلام.
نه اسم فولدر نیست. اسم یکی از رولهای تعریف شده هستش. یعنی کاربرایی که تو نقش مدیریتی هستن اجازه دارن


اون بنده خدا که گفته این namespace مربوط به کلاسشه


خب پس از کجا بفهمه کدوم فلدری که ما ایجاد کردیم واسه admine کدوم usere ؟ اسم فلدرا کجا باید بنویسیم؟ شاید چندتا فلدر داشتیم!!:ناراحت:

بعد اینکه namespase نداره که کل کلاسی که گفتند ایجاد کنیم اینه تو پروژه من ::لبخند:



using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
/// <summary>
/// Summary description for Class2
/// </summary>
///
public class MySiteRoleProvider : System.Web.Security.RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
throw new NotImplementedException();
}
public override string[] GetRolesForUser(string username)
{
string[] UserRolename = new string[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // ¦يë§ë ëںê ëç¬ کں© © ںھ §ی¢ں ی«
return UserRolename;
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}

z_bluestar
چهارشنبه 19 آبان 1389, 08:51 صبح
راستی خانوم z_bluestar چرا اینجا گفتید


public override string[] GetRolesForUser(string username)
{
string[] UserRolename=new string[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس
return UserRolename;
}
اول یه آرایه از نوع استرینگ که فقط یه عضو داره و مقداری رو که از دیتابیس گرفتید ریختید تو UserRolename[0] .. اگه قراره که فقط یه رول برگردونه که خوب اولا احتیاجی به آرایه نیست و با یه متغیر string کار راه میافته
و دوم اینکه لازمش اینه که هر کاربر فقط یه نقش داشته باشه . ولی ممکنه یه کاربر چند تا نقش هم داشته باشه (نه صرفا یه نقش) ضمن اینکه از اسم این تابع معلومه که ممکنه نقش این کاربر بیش از یکی باشه.
همه نقشهای این کاربر توسط ریدر از بانک خونده میشن و با کاما از هم جدا میشن و وقتی از ریدر اومدیم بیرون توسط تابع split نقشها رو تو قالب یه آرایه برمیگردونیم

دوست عزیز خروجی متد از نوع string[] است چون به قول خودتون یک کاربر می تونه چند تا Role داشته باشه ولی ما اینجا فقط یک Role داریم .

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


خب پس از کجا بفهمه کدوم فلدری که ما ایجاد کردیم واسه admine کدوم usere ؟ اسم فلدرا کجا باید بنویسیم؟ شاید چندتا فلدر داشتیم!!:ناراحت:

بعد اینکه namespase نداره که کل کلاسی که گفتند ایجاد کنیم اینه تو پروژه من ::لبخند:


مهندس خوب دقت نمی کنیا اولا من گفتم تو همون فولدری که می خوای مثلا فولدر Administrator یک فایل web.config ایجاد کن بعد اینا رو توش بنویس .

خوب این طوری درستش کن

namespace abcconstruct.Classes
{
public class MySiteRoleProvider : RoleProvider
{


دوست عزیز میشه د رابطه با این کد توضیح بدید؟ چطور باید از db نقش کاربر رو بخونم؟

UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس

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

خوب دوست عزیز من از n-tir استفاده میکنم شما با هر چی که دلت می خواد میتونی بخونی
با Query ، StoreProcedure ,... کاری نداره یه select از database

select Rolename
From Users inner join Roles on Users.RoleID =Roles.RoleID
where username =@Username

Himalaya
چهارشنبه 19 آبان 1389, 09:57 صبح
دوست عزیز خروجی متد از نوع string[] است چون به قول خودتون یک کاربر می تونه چند تا Role داشته باشه ولی ما اینجا فقط یک Role داریم .

سلام. میدونم خروجی از نوع آرایه ای از استرینگ هستش. منظورم این بود که اگه قرار بود یه رول باشه خودشون اون خروجی رو از نوع استرینگ میگرفتن نه یه آرایه از نوع استرینگ (ماکروسافتی ها رو میگم :لبخند:)
ممنون

صادق صدقی
پنج شنبه 20 آبان 1389, 01:29 صبح
دوستان سلام
خیلی بحثه فوق العاده ایه
لطفا ادامش بدین و به یک نتیجه گیریه دست جمعی برسین که بلاخره بهترین و کامل ترین و امن ترین راه کدومه تا به صورت یک پی دی اف در بیاریم و بزاریم واسه بقیه
من 3 صفحه رو خوندم
فی ما بین صفحات از ایمیل هم گاهی پست زدین
لطفا یکی از دوستان یک ایمیل بسازه
و یک پروژه کامل ارسال ایمیل بنویسه
در صورتی که ایمیل ها به spam ها منتقل نشه(چون من هنوز نتونستم یک ایمیله بدون نقص رو بفرستم)
فکر کنم مشکله خیلی از بچه هاست
یا حدا اقل کامل کدها رو توضیح بدین و بخصوص سروری که باید ست بشه مثلا یاهوه چی باید بنویسیم و....

باتشکر



----------------------------------------------
کتاب های فارسی ASP.Net (http://barnamenevis.org/showthread.php?t=243542&page=1)

سلام
من این فیلم آموزشی مایکروسافت رو پیدا کردم

لینک (http://download.microsoft.com/download/4/1/9/4194800d-ba53-423b-a379-f668cb08502c/winvideo-ASP-AsynchronousEmail.wmv) دانلود


این سورسه خوده مایکروسافته
کسی می تونه ارورشو بگیره؟






----------------------------------------------
کتاب های فارسی ASP.NET (http://barnamenevis.org/showthread.php?t=243542&page=1)

mmnoody2006
شنبه 22 آبان 1389, 16:59 عصر
سلام به خدا حیف نیست بحث به این شیرینی اینجا تموم بشه .
البته من خودم مشکلی ندارم ولی مبتدی جماعت بالاخره باید یه منبع فارسی داشته
باشن تا شروع کنن یا نه .

به هر حال من یه مقاله خیلی مفید در ضمینه امنیت Authentication دارم می زارم استفاده کنی
از سایت خود مایکروسافته

z_bluestar
یک شنبه 23 آبان 1389, 18:09 عصر
شما کاربرانتون رو توسط خود asp.net دارید مدیریت می کنید و روش امنی هست .
من تا حالا مشکلی تو این روش ندیدم یا بهتر بگم روش امن تری ندیدم .

alonemm
چهارشنبه 26 آبان 1389, 15:56 عصر
براي امنت تر بودن اتصال شما هر بار پس از گرفتن اطلاعات يا اجراي رشته تقاضا تون حتما اتصال رو ببنديد مثل استفاده از كد بلاك


finaly()

در پاين كد هاتون و بستن اتصال.

unishomal
چهارشنبه 26 آبان 1389, 22:16 عصر
حالا برای استفاده کردن از این می تونیم دو روش استفاده کنیم :
1- در web.config فولدری که می خواهین مثلا فقط برای کاربران admin قابل مشاهده باشد این را بنویسید :

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

یا در صفحه ای که می خواهید Role کاربر را چک کنید این کد را بویسید .
String[] Role = RoleProvider.GetRolesForUser(txtLUsername.Text);
if (Role[0] == "Company")
Response.Redirect("~/Customer/");
else
Response.Redirect("~/User/");

یا برای چک کردن این که آیا این کاربر دارای نقش مورد نظر هست یا نه ؟؟

bool IsinRole = HttpContext.Current.User.IsInRole("Administrator");

با این احتساب تمام متدهای مورد نیاز ما باس باز نویسی شه،درسته؟

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

z_bluestar
چهارشنبه 26 آبان 1389, 23:05 عصر
با این احتساب تمام متدهای مورد نیاز ما باس باز نویسی شه،درسته؟

اگه اشتباه می کنم را هنماییم کنید..
ممنون
منظورتون رو متوجه نشدم ؟ منظورتون کدوم متد ها ست ؟؟

unishomal
پنج شنبه 27 آبان 1389, 14:18 عصر
منظورتون رو متوجه نشدم ؟ منظورتون کدوم متد ها ست ؟؟

همونایی که با ارث بری از کلاس rolrprovider ،پیاده سازی شده....

z_bluestar
پنج شنبه 27 آبان 1389, 22:40 عصر
همونایی که با ارث بری از کلاس rolrprovider ،پیاده سازی شده....

خوب شما اونهایی را که احتیاج دارید تغییر بدید می تونید دوباره پیاده سازی کنید. و در واقع هر متد را که لازم داشتید Customize کنید

fmka2f
جمعه 19 آذر 1389, 13:18 عصر
حالا ما می تونیم هر کدام از این متدها رو بر حسب نیازمون تغییر بدیم مثلا برای متد GetRolesForUser

public override string[] GetRolesForUser(string username)
{
string[] UserRolename=new string[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // خوندن نام نقش کاربر از دیتابیس
return UserRolename;
}

سلام
من وقتی این قسمت رو مینویسم ارور زیر رو میده میتونید لطفا راهنماییم کنید

The name 'DataLayer' does not exist in the current context

z_bluestar
چهارشنبه 24 آذر 1389, 17:03 عصر
بهتره یه کم دقت داشه باشید به جای این همه عجله :لبخندساده:
DataLayer.Users.RoleName(username);

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

razeghaik1
شنبه 04 دی 1389, 00:12 صبح
دوست عزیز من یه فروشگاه طراحی کردم و یه سایت خبری . در مورد بحث ثبت نام و لوگین کردن در سایت به نظر من بهترین راه برای لوگین کردن و چک کردن افراد بعد از اینکه نام کاربری و کلمه عبور خودشون رو وارد کردن اینه که تعداد رکورد های کاربران ثبت نامی رو بشماری که اگه بزرگتر از یک بود یعنی فرد یک کاربر سایت است و یک سیشن به او می دهید با مقدار نام کاربری خودش که منحصر به فرد می باشد.من راه های زیادی رو سوال کردم و تست کردم دیدم واقعا این راه عملی تر و بهتره ...
بحث ثبت نام هم که خیلی راحته.بازیابی رمز عبور هم که با استفاده از بحث ارسال ایمیله.بحث تغییر رمز هم که در واقع خیلی خیلی راحته.سوالی اگه هست در صورتی که بلد باشم جوابتونو می دم...

z_bluestar
دوشنبه 06 دی 1389, 09:02 صبح
سلام خدمت دوستان
ممنون از بابت زحماتی که کشیدید . من یک سوال دارم :
چطری میشه کاری کرد که خود مدیر role جدید تعریف کنه و یا در سطح دسترسی role تغییراتی بده ؟

با تشکر

می تونید از متد زیر
public override void CreateRole(string roleName)
در کلاس RoleProvider استفاده کنید .

z_bluestar
پنج شنبه 09 دی 1389, 11:06 صبح
با سلام
ممنون از این بحث خوب
سوالم این بود که حالا این کلاسی که ساختیم رو کجا باید فراخوانی کنیم
این کلاس توسط .net اتوماتیکی فراخونی میشه در جاهای مختلف

unishomal
پنج شنبه 16 دی 1389, 17:41 عصر
سلام به همه دوستان وقت بخیر

من همه این تاپیکارو خوندم یه مشکل دارم می دونم مبتدی اما لطفا کمک کنید..

واسه log out کاربر باس چه کدیو نوشت...مثلا session خاصی باس حذف کرد? مطمینا redirect به تنهایی کافی نیست...
واسه login من از کد زیر استفاده کردم....


FormsAuthentication.RedirectFromLoginPage(tb_usern ame.Text, false);

unishomal
پنج شنبه 16 دی 1389, 17:58 عصر
شما اول بگو که ایا از مایکروسافت ممبرشیپ استفاده میکنی؟
من روال همین تاپیکو پیش گرفتم یعنی سعی کردم صفحه loginam سفارشی باشه نه فقط rolprovideresho استفاده کردم که اونم سفارشی شده.

<system.web>
<authentication mode="Forms">
<forms name=".Authenticationmysite" loginUrl="~/login.aspx" defaultUrl="~/Default3.aspx" slidingExpiration="true" timeout="43200" path="/" protection="All">
</forms>
</authentication>
<roleManager defaultProvider="SiteRoleProvider" enabled="true">
<providers>
<clear/>
<add name="SiteRoleProvider" type="abcconstruct.Classes.roleprovider"/>
</providers>
</roleManager>

karimi84
شنبه 18 دی 1389, 15:21 عصر
اگر لاگینی مانند همین سایت بخواهیم بسازیم چی کار باید بکنیم
مشکل من اینجاست که در صفحه مسترپیچ نام کاربر چک می شود و ابتدای صفحه نمایش داده می شود یعنی کاربر می تواند از صفحات مختلف لاگین بشود مشکل اینجاست که بعد از لاگین شدن و چک شدن درستی lable مربوطه در مسترپیچ مقدار میگیرد (در هنگام تریس کردن) ولی وقتی که از صفحه ای که کاربر لاگین کرده است وارد می شود مقدار فیلد مذکور خالی نمایش داده میشود
لطفا راهنمائی کنید

araelectronic@ymail.com
یک شنبه 03 بهمن 1389, 21:08 عصر
با تشکر بسیار زیاد ازدوستان
من چند تا سوال داشتم:
1- آیا میشه این روش را برای حالتی که رولها معلوم نیست استفاده کرد؟ بعنوان مثال در یک نرم افزار که باید رولها برای هر کاربر بطور خاص تعریف شود و یا اینکه بنا به نیاز سطح دسترسی کاربران تغییر نمایید؟

2- جاییکه من متوجه نمی شوم نحوه نگهداری رول و کد کاربر می باشد ، برای اینکه بتوان رول کاربر را در ورود به صفحات چک کرد بهترین راه چی هست ؟ ظاهرا تو این روش صفحات گروه بندی میشن و دسترسی ها به فولدرها داده میشه .

با تشکر

Alen
پنج شنبه 04 فروردین 1390, 17:19 عصر
سلام به همه دوستان وقت بخیر

من همه این تاپیکارو خوندم یه مشکل دارم می دونم مبتدی اما لطفا کمک کنید..

واسه log out کاربر باس چه کدیو نوشت...مثلا session خاصی باس حذف کرد? مطمینا redirect به تنهایی کافی نیست...
واسه login من از کد زیر استفاده کردم....


FormsAuthentication.RedirectFromLoginPage(tb_usern ame.Text, false);






دوست عزیز
از این متد استفاده کن


FormsAuthentication.SignOut();



با سلام
یه سئوال مبتدی
در vs2010 ما میبینیم که وقتی یه پروژه جدید درست میکنیم خودش به صورت پیش فرض امکانان لاگین رو توی سایت جدید گذاشته.
این امکانات چه جوری کار میکنه وقتی هیچ کدی سمت سرویس دهنده نوشته نشده؟؟؟؟؟؟ اطلاعات کجا ذخیره میشن؟؟؟؟؟

اگه از SQL Express استفاده میکنی تو یه پایگاه داده به نام
ASPNETDB.MDB
که تو پوشه App_Data نگهداری میشه
البته میشه خودت هم پایگاه داده رو انتخاب کنی
دوستان ببخشید ، من دیر این تاپیک رو دیدم ، شرمنده شاید تا الان جواب سوالهاتون رو گرفته باشید

مشکلی که من دارم اینه که من سه دسته کاربر تو سایتم دارم
و هر کدوم از اینا باید بعد Sign in کردن به صفجه مورد نظر خودشون هدایت بشن
من برای این کار سه دسته صفحه طراحی کردم که هر کدوم تو فولدر مربوطه خودشون قرار دارن
webconfig هر فولدر رو هم تنظیم کردم تا فقط کاربرای همون دسته بهش دسترسی داشته باشن
مشکل اینه که بعد از Sign in کردن چطور کاربر رو به صفحه پیش فرض دسته مربوط به خودش هدایت کنم؟
چون تو webcongif فقط یه Defaultpage با استفاده از کد زیر قابل تعریف هستش


<forms name="AuthenticationManager" loginUrl="~/Management/Default.aspx" defaultUrl="~/Management/Management.aspx" slidingExpiration="true" timeout="43200">
</forms>

البته می تونم مثل همین سایت برنامه نویس عمل کنم یعنی کاربر بعد از زدن دکمه ورود به یه صفحه میانی منتقل بشه ، اونجا نقشش چک بشه و بعد بره به صفحه پیش فرض دسته خودش ، اما میخوام ببینم راهی نیست که این صفحه میانی رو از این وسط بردارم؟

fa_karoon
یک شنبه 16 مرداد 1390, 12:39 عصر
سلام می خواستم بدونم در روشی که از جداول ممبر شیپ استفاده می کنیم می تونیم به فیلدهای جداولش اضافه کنیم یا اینکه به جداولش جدولی اضافه کنیم
سوال دوم اینکه دوستان می تونید بگید مزیت روشی که خانم z_BlueStar یاد دادن نسبت به استفاده از جداول ممبرشیپ به صورت سفارشی چی هست؟ آیا در روشی که خانم z_BlueStar گفتن چون توابع رو باز خودمون Overrideمی کنیم امنیت پایین نمی آید؟

hjran abdpor
یک شنبه 16 مرداد 1390, 17:03 عصر
باید براساس نقش های کاربرانت این کار را انجام بدید

ardalanjoon
دوشنبه 17 مرداد 1390, 00:21 صبح
با سلام. من واسه ثبت نام كاربران توي سايت، از كنترل create user استفاده نكردم چون فيلدهاي اين كنترل كم هست و جوابگوي خواسته ي من نيست. خودم يك فرم با table طراحي كردم كه با زدن دكمه ي ثبت اطلاعات كاربر وارد بانك اطلاعاتي ميشه. اما حالا نميدونم چه طور بايد به كاربرانم نقش بدم و دسترسيشونو به صفحات كنترل كنم. ميدونم اگه از كنترلهاي create user , login استفاده ميكردم كارم راحت بود و در فايل asp.net configuration راحت ميتونستم نقش تعريف كنم اما علت اينكه اين كار رو نكردمو گفتم. كسي ميتونه كمكم كنه؟؟؟؟؟ لطفاااااااااااااااااااااا اااا. از همه متشكرم

fa_karoon
دوشنبه 17 مرداد 1390, 23:26 عصر
سلام دوستان دقت کردید این تاپیک شده فقط سوال های بی جواب(یا بهتر بگم سوال هایی که اگه صفحه های اول رو با دقت بخونید شاید به جوابتون برسید)
جناب ardalanjoon شما هم فکر می کنم می تونید هم از جداول ممبر شیپ استفاده کنید و با تغییر در فیلدهای جدول و به خواستتون برسید هم بتونید از توابع آماده این روش استفاده کنید اگه این آموزش رو کامل بخونید و انجام بدید احتمالا پی می برید که چه جوری نقش تعریف کنید
موفق باشید

ardalanjoon
سه شنبه 18 مرداد 1390, 17:28 عصر
سلام دوستان دقت کردید این تاپیک شده فقط سوال های بی جواب(یا بهتر بگم سوال هایی که اگه صفحه های اول رو با دقت بخونید شاید به جوابتون برسید)
جناب ardalanjoon شما هم فکر می کنم می تونید هم از جداول ممبر شیپ استفاده کنید و با تغییر در فیلدهای جدول و به خواستتون برسید هم بتونید از توابع آماده این روش استفاده کنید اگه این آموزش رو کامل بخونید و انجام بدید احتمالا پی می برید که چه جوری نقش تعریف کنید
موفق باشید

مرسي دوست عزيز. اما من 2 ، 3 بار اين تاپيك رو خوندم اما يه جاهايي حرفها بي سرو ته شده. اگرم جايي كد تعريف شده مبهمه و كامل نيست. جداول خود ممبر شيپ كه قابل تغيير نيست. در مورد توابع اماده هم من نميدونم اين توابع رو از كجا پيدا كنم. تو اين تاپيك از roleها واسه تعيين سطح دسترسي استفاده شده و يه جاهايي بحث شده راجع به تعيين سطح دسترسي. اما هيچ كجا نگفتن كه چه طور ميشه databaseاي كه خودمون طراحي كرديم رو به نقشها يا جداولي كه خود .net ميسازه ربط بديم. role provider فقط رو كاربراني كه با كنترل createuser ساخته شدن پياده ميشه...

fa_karoon
شنبه 12 آذر 1390, 19:14 عصر
tkt = New FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now(), _ dateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data")
سلام دوستان
می خواستم بدونم آیا موقع استفاداز Ticket مانند خط بالا می توان اطلاعات دیگری مانند ID کاربر رو در اون نگه داشت
یا اینکه فقط همین چیزهایی که در این کد گفته قابل ذخیره است؟

ab_ir_007
شنبه 22 بهمن 1390, 23:57 عصر
خوب شما اونهایی را که احتیاج دارید تغییر بدید می تونید دوباره پیاده سازی کنید. و در واقع هر متد را که لازم داشتید Customize کنید
سرکار خانم z_bluestar با تشکر از اموزش مفیدتون
من چند تا سوال برام پیش اومده که اگه لطف کنید جواب بدین ممنون میشم
اول اینکه ممکنه چند تا مثال از اینکه در چه مواردی متد ها رو دوباره پیاده سازی میکنیم بزنین چون متوجه نمیشم مثلا در این مورد مثال شما مگه بصورت پیش فرض همه رول های کاربر رو بر نمی گردونه که ما اونو دوباره پیاده سازی میکنیم؟ در ضمن در مورد اینکه چطور از table ای که خودمون ساختیم در roleProvider استفاده کنیم هنوز مطلب برام جا نیوفتاده یعنی میشه رولها رو از هر جدول دیگه یی خوند ؟!! چطور این موضوع رو در web.config در بخش RoleProvider باید اعلام کنیم که جدول مورد نظرمون برای رولها کدومه؟؟!!!....
سوال دوم در مورد استفاده از SiteMap در web.config هست من قبلا از سیستم پیش فرض Membership و RoleProvider استفاده میکردم و با فعال کردن SecurityTrimmingEnable میتونستم از خاصیت دسترسی ها در منوی asp استفاده کنم الان با این شرایط که رولها از جدولی که خودمون ساختیم دریافت میشن وضعیت چطور خواهد بود؟

fakhravari
یک شنبه 23 بهمن 1390, 02:15 صبح
با سلام
به جواب دوستمون در پست 62
به این لینک سر بزنید و امکاناتی که لازم دارید بکار رفته.
http://barnamenevis.org/showthread.php?319398-%D8%B3%D8%A7%DB%8C%D8%AA-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF

ab_ir_007
یک شنبه 23 بهمن 1390, 11:35 صبح
با سلام
به جواب دوستمون در پست 62
به این لینک سر بزنید و امکاناتی که لازم دارید بکار رفته.
http://barnamenevis.org/showthread.php?319398-%D8%B3%D8%A7%DB%8C%D8%AA-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF
دوست عزیز آقای Fakhravariممنون از لینکی که دادین ، اما متاسفانه کمکی نکرد، جواب سوالهای من همچنان بی پاسخ مونده!!

ab_ir_007
جمعه 28 بهمن 1390, 21:08 عصر
سلام به دوستان
ممکنه کسی کمک کنه کد public override void AddUsersToRoles(string[] usernames, string[] roleNames) رو برای قسمت کلاسی که خودمون تعریف میکنیم مثل مثالی که برای GetRolesForUser نوشته بودیم بزاره ؟!! راستش به نظر چون لیست کاربر یا رول هست یکم سخت به نظر میرسه ضمنا این کد باید برای AddUserToRole ، AddUsersToRole، AddUserToRoles و AddUsersToRoles باشه.
ممنون از لطف همه شما

maktab
یک شنبه 31 شهریور 1392, 20:56 عصر
برای استفاده از کلاس FormsAuthentication باید یکسری تغییرات در فایل web.config پروژه هم بدید

[SOURCE="xml"]<authentication mode="Forms">
<forms name=".Authenticationmysite" loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" slidingExpiration="true" timeout="43200">
</forms>


من اومدم و ممبرشیب را سفارشی کردم. همه چیز هم درست کار میکنه به غیر از سشن اون. از چنین روش هایی هم استفاده کردم ولی جواب نداد. میشه دربارش توضیح بدید

setareh2013
یک شنبه 31 شهریور 1392, 21:22 عصر
دوست عزیز لینک های فعال سازی کلا از یک روند استفاده می کنند
شما برای هر کاربر یه فیلد به هر نامی از نوع boolean یا در sql server که همون bit می شه میزاری
که مقدارش در حالت پیش فرض false می شه حالا از طریق لینک آدی کاربر رو هم می فرستی مثلا :
www.sitename.com/useractive/activer.aspx?userid=124 (http://www.sitename.com/useractive/activer.aspx?userid=124)
این مقدار 124 که آدی کاربر ماست رو به صفحه activer میفرسته در این صفحه روالی وجود داره که
از طریق کوئری استرینگ مقدار آی دی کاربر رو می گیره و فیلد مربوط به کاربر رو به true آپدیت می کنه

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