mehdi58
شنبه 20 بهمن 1386, 22:13 عصر
با سلام
اول از همه به خاطر طولانی بودن تاپیک از همه دوستان معذرت خواهی می کنم . ( جهت اطلاع دوستان بگم که من از ASP.NET 1.x استفاده می کنم )
فرض کنید که سه تا دایرکتوری مختلف دارم با سه تا نقش مجزا و می خوایم که هر کاربر با توجه به نقشش فقط بتونه صفحات مربوط به خودش رو ببینه.
کاربران من بعضی هاشون فقط یه نقش و بعضی هاشون بیش از یه نقش دارن . از طرفی ( با توجه به نظر کارفرما ) هر کاربر فقط یه دونه کلمه کاربری ( Username ) داره ( یعنی اگه دوتا نقش هم داشته باشه باز هم یه Username داره ) .
روال کار به این صورته که ابتدا کاربر وارد صفحه Login می شه ، و User و Pass اش چک می شه و در صورتیکه در دیتا بیس موجود بود ، یه لیست از نقشهای مجازش رو می بینه .
حالا بعد از انتخاب یکی از اون نقشها ، کدهای زیر رو داریم :
Dim strVal As Integer= RadioButtonList1.SelectedValue
'تعیین حق دسترسی کاربر
Select Case strVal
‘ورود نقش 1
Case 1
Call userName_session()
Call roleset("role1")
Response.Redirect("role1/ role1HOME.aspx")
‘ورود نقش 2
Case 2
Call userName_session()
Call roleset("role2")
Response.Redirect("role2/role2HOME.aspx")
‘ورود نقش 3
Case 3
Call userName_session()
Call roleset("role3")
Response.Redirect("role3/role3HOME.aspx")
End Select
--------------------------------------------------------------------
Public Sub userName_session()
Session("userName") = TextBox1.Text
Session("role") = RadioButtonList1.SelectedItem.Text
End Sub
--------------------------------------------------------------------
Public Sub roleset(ByVal r As String)
FormsAuthentication.Initialize()
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, Session("userName"), DateTime.Now, DateTime.Now.AddMinutes(15), True,FormsAuthentication.FormsCookiePath)
Dim hash As String = FormsAuthentication.Encrypt(ticket)
Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, hash)
If ticket.IsPersistent Then
cookie.Expires = ticket.Expiration
End If
Response.Cookies.Add(cookie)
End Sub
--------------------------------------------------------------------
و با این کار به صفحه مربوط به نقشش هدایت می شه.
فایلهای Web.Config مربوط به هر کدوم از دایرکتوریهام به صورت زیره :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<authorization>
<allow roles="role1"/>
role2 و role3 برای سایر دایرکتوریها نبز به همین ترتیب
<deny users="*" />
</authorization>
</system.web>
</configuration>
و فایل Web.Config پروژه هم به صورت زیره :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation defaultLanguage="vb" debug="true">
<assemblies>
<add assembly="CrystalDecisions.CrystalReports.Engine, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.ReportSource, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Shared, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Web, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
</assemblies>
</compilation>
<!--********************** Page Error **********************-->
<customErrors defaultRedirect="PageError.aspx" mode="RemoteOnly"/>
<authentication mode="Forms">
<forms name="myCookie" loginUrl="index.aspx" protection="All" timeout=10 path="/">
<credentials passwordFormat="SHA1">
</credentials>
</forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="15"/>
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
</system.web>
<location path="Pageerror.aspx">
<system.web>
<authorization>
<allow roles="db"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="errorMessage.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
</configuration>
حالا اگه یه کاربر بخواد بدون لوگین کردن وارد یه صفحه بشه بهش اجازه داده نمی شه و همین طور اگه کاربری بعد از لوگین توی Url آدرسی رو تایپ کنه که مربوط به نقشش نیست باز هم وارد اون صفحه نمی تونه بشه .
فرض می کنیم کاربر X با نقش role1 لوگین می کنه و به آدرس http:\\ localhost\myproj\role1\role1home.aspx منتقل می شه .
( از این به بعد در هر کدوم از صفحات Username اش نمایش داده می شه )
اما مشکل اینه که مثلا اگه این کاربر در حین انجام کار یه پنجره دیگه IE رو باز کنه و یه آدرسی مثل http:\\ localhost\myproj\role1\role1page.aspx رو تایپ کنه اون وقت بعضی وقتها با صفحه خطا روبرو می شه و بعضی وقتها هم صفحه مورد نظر درست لود می شه اما در جلوی نام کاربر چیزی نمایش داده نمی شه .
به نظر شما دلیلش چی می تونه باشه ؟
اول از همه به خاطر طولانی بودن تاپیک از همه دوستان معذرت خواهی می کنم . ( جهت اطلاع دوستان بگم که من از ASP.NET 1.x استفاده می کنم )
فرض کنید که سه تا دایرکتوری مختلف دارم با سه تا نقش مجزا و می خوایم که هر کاربر با توجه به نقشش فقط بتونه صفحات مربوط به خودش رو ببینه.
کاربران من بعضی هاشون فقط یه نقش و بعضی هاشون بیش از یه نقش دارن . از طرفی ( با توجه به نظر کارفرما ) هر کاربر فقط یه دونه کلمه کاربری ( Username ) داره ( یعنی اگه دوتا نقش هم داشته باشه باز هم یه Username داره ) .
روال کار به این صورته که ابتدا کاربر وارد صفحه Login می شه ، و User و Pass اش چک می شه و در صورتیکه در دیتا بیس موجود بود ، یه لیست از نقشهای مجازش رو می بینه .
حالا بعد از انتخاب یکی از اون نقشها ، کدهای زیر رو داریم :
Dim strVal As Integer= RadioButtonList1.SelectedValue
'تعیین حق دسترسی کاربر
Select Case strVal
‘ورود نقش 1
Case 1
Call userName_session()
Call roleset("role1")
Response.Redirect("role1/ role1HOME.aspx")
‘ورود نقش 2
Case 2
Call userName_session()
Call roleset("role2")
Response.Redirect("role2/role2HOME.aspx")
‘ورود نقش 3
Case 3
Call userName_session()
Call roleset("role3")
Response.Redirect("role3/role3HOME.aspx")
End Select
--------------------------------------------------------------------
Public Sub userName_session()
Session("userName") = TextBox1.Text
Session("role") = RadioButtonList1.SelectedItem.Text
End Sub
--------------------------------------------------------------------
Public Sub roleset(ByVal r As String)
FormsAuthentication.Initialize()
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, Session("userName"), DateTime.Now, DateTime.Now.AddMinutes(15), True,FormsAuthentication.FormsCookiePath)
Dim hash As String = FormsAuthentication.Encrypt(ticket)
Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, hash)
If ticket.IsPersistent Then
cookie.Expires = ticket.Expiration
End If
Response.Cookies.Add(cookie)
End Sub
--------------------------------------------------------------------
و با این کار به صفحه مربوط به نقشش هدایت می شه.
فایلهای Web.Config مربوط به هر کدوم از دایرکتوریهام به صورت زیره :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<authorization>
<allow roles="role1"/>
role2 و role3 برای سایر دایرکتوریها نبز به همین ترتیب
<deny users="*" />
</authorization>
</system.web>
</configuration>
و فایل Web.Config پروژه هم به صورت زیره :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation defaultLanguage="vb" debug="true">
<assemblies>
<add assembly="CrystalDecisions.CrystalReports.Engine, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.ReportSource, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Shared, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Web, Version=9.1.5000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
</assemblies>
</compilation>
<!--********************** Page Error **********************-->
<customErrors defaultRedirect="PageError.aspx" mode="RemoteOnly"/>
<authentication mode="Forms">
<forms name="myCookie" loginUrl="index.aspx" protection="All" timeout=10 path="/">
<credentials passwordFormat="SHA1">
</credentials>
</forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="15"/>
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
</system.web>
<location path="Pageerror.aspx">
<system.web>
<authorization>
<allow roles="db"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="errorMessage.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
</configuration>
حالا اگه یه کاربر بخواد بدون لوگین کردن وارد یه صفحه بشه بهش اجازه داده نمی شه و همین طور اگه کاربری بعد از لوگین توی Url آدرسی رو تایپ کنه که مربوط به نقشش نیست باز هم وارد اون صفحه نمی تونه بشه .
فرض می کنیم کاربر X با نقش role1 لوگین می کنه و به آدرس http:\\ localhost\myproj\role1\role1home.aspx منتقل می شه .
( از این به بعد در هر کدوم از صفحات Username اش نمایش داده می شه )
اما مشکل اینه که مثلا اگه این کاربر در حین انجام کار یه پنجره دیگه IE رو باز کنه و یه آدرسی مثل http:\\ localhost\myproj\role1\role1page.aspx رو تایپ کنه اون وقت بعضی وقتها با صفحه خطا روبرو می شه و بعضی وقتها هم صفحه مورد نظر درست لود می شه اما در جلوی نام کاربر چیزی نمایش داده نمی شه .
به نظر شما دلیلش چی می تونه باشه ؟