2009-06-26 89 views
7

我有一個ASP.Net網站,它具有多個角色,每個角色都可以訪問一個單獨的目錄(即管理員用戶可以訪問/ admin,購物者可以訪問/購物等),使用共享登錄頁面。如果有人訪問登錄頁面並將返回URL設置爲他們無權訪問的目錄(例如,購物者訪問/login.aspx?returnurl=/admin/index.aspx),則用戶可以成功進行身份驗證(登錄憑據是有效),但他們最終回到登錄頁面(他們無法訪問他們請求的頁面)。確定用戶是否可以訪問請求的頁面?

我該如何撿起來,以便我可以顯示一條消息來做用戶?

回答

2

我結束了在登錄頁面的Page_Load事件中這樣做:

if (User.Identity.IsAuthenticated) 
{ 
    LoginErrorDetails.Text = "You are not authorized to view the requested page"; 
} 

的思維是,如果通過身份驗證的用戶在登錄頁面結束了,他們要麼被送往他們的作爲的結果試圖訪問他們沒有被授權查看的頁面,或者他們已經通過身份驗證,然後手動轉到登錄頁面(不太可能)。

當用戶訪問登錄頁面時(如果他們已經通過身份驗證),還可以將用戶發送到相關主頁。

0

您可以重定向他索引頁,告訴他,他不能訪問該頁面)

+0

我如何知道他不能訪問該頁面? 我可以確定他在哪個角色,但不能訪問請求的頁面。 – user9659 2009-06-26 11:01:35

+0

那麼你應該做出像關卡一樣的東西。如果你有4級以上,你可以訪問該頁面。或者對於角色,您應該在每個頁面上指定一個可以訪問該頁面的特定角色。 – Timotei 2009-06-26 11:53:55

1

如果你有不同的目錄和您正在使用asp.net驗證它是很容易的。 所有你需要的是把web.config文件中的每個目錄,並確定哪些可以訪問文件在該目錄中這樣的角色:

<authorization> 
    <allow roles="shoppers"/> 
    <deny users="?"/> 
</authorization> 

您可以從this文章獲得MSDN

您可以更詳細信息設置所有主web.config中像這樣:

<!-- Configuration for the "sub1" subdirectory. --> 
     <location path="sub1"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1" type="Type1"/> 
      <add verb="*" path="sub1" type="Type2"/> 
      </httpHandlers> 
     </system.web> 
     </location> 

     <!-- Configuration for the "sub1/sub2" subdirectory. --> 
     <location path="sub1/sub2"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1/sub2" type="Type3"/> 
      <add verb="*" path="sub1/sub2" type="Type4"/> 
      </httpHandlers> 
     </system.web> 
     </location> 
    </configuration> 

這是this文章MSDN :)

編輯:

在您的網頁加載方法做到這一點:

if(!User.IsInRole("shopper")) 
{ 
    lblNoAccess.Visible=true; 
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS"; 
} 

希望這可以幫助你!

+0

該網站已經按照與您發佈的內容相似的方式進行了設置 - 但是,您發佈的內容實際上並不以任何方式回答我的問題。 – user9659 2009-06-26 11:25:10

+0

好吧現在我得到了你,使用已驗證,但無權查看此頁面!我編輯了我的答案 – TheVillageIdiot 2009-06-26 12:03:06

1

一種方法是重寫您的aspx表單的OnLoad,並檢查經過身份驗證的用戶是否被允許根據角色訪問資源。所以,你創建例如BasePage.cs(其中你定義一個類的BasePage它繼承自System.Web.UI.Page)從所有窗體(ASPX)繼承,在你這樣做:

protected override void OnLoad(EventArgs e) 
{ 
    InitializeSitemap(); 
    if (SiteMap.CurrentNode != null) 
    { 
     if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode))) 
     { 
      // You can redirect here to some form that has a custom message 
      Response.Redirect("~/Forms/Logout.aspx"); 

      return; 
     } 
    } 
    base.OnLoad(e); 
} 

然後在您的UrlHelper類,你需要的是上面使用IsAccessible功能:

public static bool IsAccesible(SiteMapNode node) 
{ 
    bool toRole = false; 

    foreach (string role in node.Roles) 
    { 
     if (role == "*" || HttpContext.Current.User.IsInRole(role)) 
     { 
      toRole = true; 
     } 
    } 

    return toRole; 
} 

下面是IsAnonymousAllowed如果你想知道:

public static bool IsAnonymousAllowed(SiteMapNode node) 
{ 
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false; 
} 
0

好了,你爲什麼不抓住目錄中登錄PA GE?如果登錄頁面可以確定用戶嘗試訪問哪個目錄,也許他們可以根據角色重定向到正確的頁面。如果有人試圖去/管理,並且驗證成功,您可以檢查他們是否有訪問權限。如果沒有,您可以重定向到基本着陸頁,表示他們無權訪問,或者將其重定向到角色的着陸頁。

編輯: 您可能可以在控件的LoggedIn事件中進行重定向。

0

另一種方法是在檢查權限時設置會話變量,並在登錄頁面上顯示該變量。

所以,你可以這樣做:

if(!User.IsInRole("shopper")) 
{ 
    session("denied") = "You don't have access to shop"; 
    response.redirect("/login"); 
} 

然後在登錄頁面:

if (session("denied") != "") { 
    message.text = session("denied"); 
    session("denied") = ""; 
} 
相關問題