# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET Web Forms > گفتگو: آموزشی + ساخت لاگین

## Mohandes2009

*دوستان من هر چی گشتم بحث بدرد بخوری در رابطه با ساخت لاگین پیدا نکردم بیایین اینجا با هم بسازیم* 

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

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

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

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

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

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

----------


## fa_karoon

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

----------


## z_bluestar

بهترین راه  برای کنترل کردن کاربران و Role ها استفاده از RoleProvider خود Asp.net  می باشد .

----------


## sam166

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

----------


## z_bluestar

> *من فک میکنم دوتا 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 گفته میشه.

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

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



بعد اینکه کاربر فرم را پر کرد و دکمه 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

> بهترین راه برای کنترل کردن کاربران و Role ها استفاده از RoleProvider خود ASP.NET می باشد .


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

----------


## pikoolas

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


این پست رو بخون
https://barnamenevis.org/showth...=254874&page=2

----------


## raziee

> وستان من هر چی گشتم بحث بدرد بخوری در رابطه با ساخت لاگین پیدا نکردم بیایین اینجا با هم بسازیم
> 
> 1.لاگین به سایت
> 2.ثبت نام در سایت
> 3.بازیابی رمز عبور
> 4.تغییر رمز عبور
> 
> البته از چند نفری سوال کردم در این مورد از دوستان سایت برنامه نویس!((البته اگه تکراری هست و بحثی هست بگید من سریعاً پاک میکنم)) من چیزی ندیدم باشه
> 
> ...


بهترین راه استفاده از 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 AuthenticationExplained: Forms Authentication in ASP.NET 2.0Securing Login ControlsUnderstanding the Forms Authentication Ticket and Cookie





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


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

----------


## z_bluestar

خوب برای Login سایت



کد 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

من از طریق کتاب و نمونه برنامه تونستم این کد رو برای ورود به سایت بنویسم 
البته یه ارور میده که در صدد حل کردنش هستم ولی گفتم بزارمش که شما تحلیلش کنید اگه به درد بخور هست روش کار کنم
البته ارورشم این هست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

> بهترین راه استفاده از Membership خود دات نت هست.
> البته نه دقیقا خود Membership دات نت ، بلکه در واقع بهترین راه توسعه ی Membership بر اساس نیاز/تجربه/دانش فردی و استفاده از اون.
> 
> [/ltr]


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

با تشکر از همه

----------


## alonemm

براي قسمت دسترسي كاربران Rol بايد يك جدول داشته باشيد كه دسترسي ها توش تعريف شده باشد.
و هر كاربر يك دسترسي ميگيره. مثل مدير سيستم - كاربر - كاربردائمي ....
حالا توي صفحات بر اساس اين دسترسي ميتونيد مشخص كنيد كه مثل نظرسنجي فقط براي كاربر دائمي كار كنه و يا ....

----------


## z_bluestar

> *یه سوال از خانم  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

کد ارسال ایمیل هست به زبان vb  منبع کد:
http://articles.sitepoint.com/articl...-email-asp-net


[FONT=Courier New][SIZE=3][COLOR=#990000]<%@ 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>[/COLOR][/SIZE][/FONT]


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

----------


## mmnoody2006

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

همین  :قلب:

----------


## z_bluestar

دوستان در مورد ایمیل فعال سازی قبلا خیلی بحث شده 
چند تا لینک براتون گذاشتم:

https://barnamenevis.org/showthread.php?t=227404
https://barnamenevis.org/showthread.php?t=180928
https://barnamenevis.org/showthread.php?t=170289
https://barnamenevis.org/showthread.php?t=162936

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

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

جلوگیری کردن از کاربران ناشناس(کسانی که 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

> *خانم 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
{
publicpartialclassIndex : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
}
protectedvoid cmdCreateUser_Click(object sender, EventArgs e)
{
//Hash Password 
string HashPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Te  xt, "MD5");
//ساخت رشته اتصال و ارتباط با وب کانفیگ
string connectionString = WebConfigurationManager.ConnectionStrings["ConnactionString"].ConnectionString;
//برقراری ارتباط
SqlConnection con = newSqlConnection(connectionString);
SqlCommand cmd = newSqlCommand("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

> امکانش هست این کد رو توضیح بدید؟
>  
> 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

> این نام کاربری را در آن session یا cookie که در فایل Web.config معرفی کردید ذخیره می کند 
> پارامتر اول نام کاربر و پارامتر دوم یک مقدار bool هست که آیا نام کاربر را به خاطر بسپارد یا نه ؟؟؟
> 
> 
> <authentication mode="Forms">
> 
> <forms name=".Authentication"


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

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

----------


## baran_mehr

سلام به همه دوستان
یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!

----------


## z_bluestar

> سلام به همه دوستان
> یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!


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

----------


## Mohandes2009

> سلام به همه دوستان
> یکی از چیزایی که تو این روش خیلی کلافم میکنه اینه که مجبورم از دیتابیش خودش استفاده کنم با فیلدهای خودش، آیا روشی هست که بشه فیلد های مورد نظر خودمون رو به دیتابیس login اضافه کنیم!!


 دوتا دیتا بیس بیشتر نداریم می تونی در صفحات اولیه ببینی!

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

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

----------


## z_bluestar

> دوتا دیتا بیس بیشتر نداریم می تونی در صفحات اولیه ببینی!
> 
> یکی برای نقش ها یکی هم اطلاعات کاربران!
> 
> *خانم مهندس یه سوال چجوری میشه یکی از فیلد های جدول User  را آپدیت کرد بنظرتون بهتر نیست یک جدول به اسم status داشته باشیم تا بتونیم کاربر را بهتر غیر فعالش کنیم تو سایت؟*


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

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

----------


## Mohandes2009

> یه فیلد برای این کار داریم در جدول کاربران به پست 5 نگاه کنید 
> status = فعال یا غیر فعال کردن کاربر
> 
> هر کی بخواد میتونه Database رو متناسب با نیاز خودش طراحی کنه


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

----------


## z_bluestar

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


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

----------


## mahmood1000

> شما می توانید تمام صفحاتی که نیاز به Login دارند را در یک Folder در پروژه قرار داده و یک فایل web.Config هم به آن پوشه اضافه کنید و کد زیر را در آن بنویسید.
> 
> <configuration>
> <system.web>
> <authorization>
> <deny users="?"/>
> </authorization>
> </system.web>
> </configuration>
> ...


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

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

با تشکر

----------


## Mohandes2009

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


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

----------


## Himalaya

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


یه کم بد متوجه شدی. ببین
وقتی یه کاربری ثبت نام میکنه این فیلد به صورت پیش فرض برای اون کاربر 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

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


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

----------


## Himalaya

اینم جهت سفارشی سازی 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.Initialize 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.ApplicationVirtualPath;
      }
      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

یک کلاس در پروژه تون ایجاد کنید 
و اون رو Inherits کنید از کلاس RoleProvider
public class MySiteRoleProvider: System.Web.Security.RoleProvider
کلاس RoleProvider یک کلاس Abstract  می باشد و شما باید یک سری از متدهاش رو پیاده سازی کنید برای این کار بر روی خط تیره زیر نام کلاس RoleProvider کلیک کرده و گزینه Implement abstract class System.Web.Security.RoleProvider
را انتخاب نمایید .



بعد از 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

> کلاس 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()
> ...


 ببخشید باز سوال پیش اومد :لبخند گشاده!:  :
این خط کد ها یعنی چی؟ 
msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", smtpServer);
در ضمن حتما باید ایمیل روی دامین داشته باشیم؟ یعنی من جیمیل دارم نمی تونم استفاده کنم؟

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

----------


## Himalaya

سلام.



> یعنی نام فلدرمون را به جای 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

> یک کلاس در پروژه تون ایجاد کنید 
> و اون رو 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

> سلام.
> نه اسم فولدر نیست. اسم یکی از رولهای تعریف شده هستش. یعنی کاربرایی که تو نقش مدیریتی هستن اجازه دارن
> 
> 
> اون بنده خدا که گفته این 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>
/// 
publicclassMySiteRoleProvider : System.Web.Security.RoleProvider
{
publicoverridevoid AddUsersToRoles(string[] usernames, string[] roleNames)
{
thrownewNotImplementedException();
}
publicoverridestring ApplicationName
{
get
{
thrownewNotImplementedException();
}
set
{
thrownewNotImplementedException();
}
}
publicoverridevoid CreateRole(string roleName)
{
thrownewNotImplementedException();
}
publicoverridebool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
thrownewNotImplementedException();
}
publicoverridestring[] FindUsersInRole(string roleName, string usernameToMatch)
{
thrownewNotImplementedException();
}
publicoverridestring[] GetAllRoles()
{
thrownewNotImplementedException();
}
publicoverridestring[] GetRolesForUser(string username)
{
string[] UserRolename = newstring[1];
UserRolename[0] = DataLayer.Users.RoleName(username); // ¦يë§ë ëںê ëç¬ کں© © ںھ §ی¢ں ی« 
return UserRolename;
}
publicoverridestring[] GetUsersInRole(string roleName)
{
thrownewNotImplementedException();
}
publicoverridebool IsUserInRole(string username, string roleName)
{
thrownewNotImplementedException();
}
publicoverridevoid RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
thrownewNotImplementedException();
}
publicoverridebool RoleExists(string roleName)
{
thrownewNotImplementedException();
}
}

----------


## z_bluestar

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


دوست عزیز خروجی متد از نوع 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

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


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

----------


## صادق صدقی

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

باتشکر



----------------------------------------------
کتاب های فارسی ASP.Net

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

لینک دانلود


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






----------------------------------------------
کتاب های فارسی ASP.NET

----------


## mmnoody2006

سلام به خدا حیف نیست بحث به این شیرینی اینجا تموم بشه .
البته من خودم مشکلی ندارم ولی مبتدی جماعت بالاخره باید یه منبع فارسی داشته
باشن تا شروع کنن یا نه . 

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

----------


## z_bluestar

شما کاربرانتون رو توسط خود asp.net دارید مدیریت می کنید و روش امنی هست .
من تا حالا مشکلی تو این روش ندیدم یا بهتر بگم روش امن تری ندیدم .

----------


## alonemm

براي امنت تر بودن اتصال شما هر بار پس از گرفتن اطلاعات يا اجراي رشته تقاضا تون حتما اتصال رو ببنديد مثل استفاده از كد بلاك 

finaly()

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

----------


## unishomal

> حالا برای استفاده کردن از این می تونیم دو روش استفاده کنیم : 
> 1- در web.config فولدری که می خواهین مثلا فقط برای کاربران admin قابل مشاهده باشد این را بنویسید :
> 
> <system.web>
>     <authorization>
>       <allow roles="Administrator"/>
>       <deny users="*"/>
>     </authorization>
>   </system.web>
> ...


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

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

----------


## z_bluestar

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


  منظورتون رو متوجه نشدم ؟ منظورتون کدوم متد ها ست ؟؟

----------


## unishomal

> منظورتون رو متوجه نشدم ؟ منظورتون کدوم متد ها ست ؟؟


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

----------


## z_bluestar

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


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

----------


## fmka2f

> حالا ما می تونیم هر کدام از این متدها رو بر حسب نیازمون تغییر بدیم مثلا برای متد 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

بهتره یه کم دقت داشه باشید به جای این همه عجله  :لبخند: 
DataLayer.Users.RoleName(username); 

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

----------


## razeghaik1

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

----------


## z_bluestar

> سلام خدمت دوستان
> ممنون از بابت زحماتی که کشیدید . من یک سوال دارم  :
> چطری میشه کاری کرد که خود مدیر role جدید تعریف کنه و یا در سطح دسترسی role  تغییراتی بده ؟ 
> 
> با تشکر


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

----------


## z_bluestar

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


 این کلاس توسط .net اتوماتیکی فراخونی میشه در جاهای مختلف

----------


## unishomal

سلام به همه دوستان وقت بخیر

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

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

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

----------


## unishomal

> شما اول بگو که ایا از مایکروسافت ممبرشیپ استفاده میکنی؟


 من روال همین تاپیکو پیش گرفتم یعنی سعی کردم صفحه 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

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

----------


## araelectronic@ymail.com

با تشکر بسیار زیاد ازدوستان
من چند تا سوال داشتم:
1- آیا میشه این روش را برای حالتی که رولها معلوم نیست استفاده کرد؟ بعنوان مثال در یک نرم افزار که باید رولها برای هر کاربر بطور خاص تعریف شود و یا اینکه بنا به نیاز سطح دسترسی کاربران تغییر نمایید؟

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

با تشکر

----------


## Alen

> سلام به همه دوستان وقت بخیر
> 
> من همه این تاپیکارو خوندم یه مشکل دارم می دونم مبتدی اما لطفا کمک کنید..
> 
>   واسه 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

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

----------


## hjran abdpor

باید براساس نقش های کاربرانت این کار را انجام بدید

----------


## ardalanjoon

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

----------


## fa_karoon

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

----------


## ardalanjoon

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


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

----------


## fa_karoon

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

----------


## ab_ir_007

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


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

----------


## fakhravari

با سلام 
به جواب دوستمون در پست 62
به این لینک سر بزنید و امکاناتی که لازم دارید بکار رفته.
https://barnamenevis.org/showthread.p...86%DB%8C%D8%AF

----------


## ab_ir_007

> با سلام 
> به جواب دوستمون در پست 62
> به این لینک سر بزنید و امکاناتی که لازم دارید بکار رفته.
> https://barnamenevis.org/showthread.p...86%DB%8C%D8%AF


 دوست عزیز آقای Fakhravariممنون از لینکی که دادین ، اما متاسفانه کمکی نکرد، جواب سوالهای من همچنان بی پاسخ مونده!!

----------


## ab_ir_007

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

----------


## maktab

> برای استفاده از کلاس FormsAuthentication باید یکسری تغییرات در فایل web.config پروژه هم بدید
> 
> [SOURCE="xml"]<authentication mode="Forms">
>             <forms name=".Authenticationmysite" loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" slidingExpiration="true" timeout="43200">
>             </forms>


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

----------


## setareh2013

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


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

----------

