2015-11-30 48 views
0

上午在域中所有的應用程序執行SSO的過程認證在HTTP處理程序

我所做的事情至今都

  1. 創建了形式認證父網站,登錄進行
  2. 刪除所有子應用程序的認證模式爲無
  3. 在所有子應用程序中添加處理程序,檢查用戶是否已通過認證並獲取應用程序的用戶詳細信息

規範處理程序如下

public class MyHandler : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.IsAuthenticated) 
     { 
      if (context.Session["UserDetails"] == null) 
      { 
       string userName = HttpContext.Current.User.Identity.Name; 
       UserManagement userMngmt = new UserManagement(); 
       userMngmt.GetLoggedUserDetails(userName); 
       // context.Response.Redirect(context.Request.Url.ToString(), true); 
      } 
     } 
     else 
     { 
      context.Response.Redirect("/SSO"); 
     } 
    } 
} 

的想法是,如果他被認證獲取用戶名和獲得會話他的細節和商店,並繼續與用戶信息加載請求的頁面。

但現在頁面沒有被加載。我明白,檢查後,我必須加載請求的頁面。如何做到這一點。

+0

我錯過了很多的變化之間細節 - 爲什麼它會創建一個重定向循環,爲什麼頁面沒有被加載(它是否拋出異常 - wh ich one),最重要的是描述流程。 –

+0

看看:https://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx –

+0

@Ondrej Svejdar問題重構 –

回答

2

我認爲你在錯誤的地方掛鉤。 IHttpHandler是單個網址或特定網址集的處理程序。邏輯應該是IHttpModule(檢出https://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx)。或Global.asax.cs

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var context = ((HttpApplication)sender).Context; 
    if (!context.Request.IsAuthenticated &&  
     !context.Request.Url.PathAndQuery.StartsWith("/SSO", 
     StringComparison.OrdinalIgnoreCase)) 
    { 
    context.Response.Redirect("/SSO"); 
    } 

} 

所以,你可以將任意的代碼爲每一個請求(在你的情況下,一些會議的熱身),你不必在任何地方重定向 - 因爲頁面會執行你的代碼加載後。

另請注意,依靠某些「魔術」將填充某個緩存的事實並不是一個好主意;更好的方法是使用延遲加載。

public UserData GetUserData(HttpContext context) 
{ 
    if (!context.Request.IsAuthenticated) 
    { 
     throw new Exception("Unauthorized"); 
    } 

    var result = context.Session["UserDetails"]; 
    if (result == null) 
    { 
     string userName = HttpContext.Current.User.Identity.Name; 
     var userMngmt = new UserManagement(); 
     result = userMngmt.GetLoggedUserDetails(userName); 
     context.Session["UserDetails"] = result; 
    } 
    return result; 
} 

所以,你仍然可以使用Session作爲高速緩存,但是你會用它作爲緩存,只有當明確要求,並就在您的數據來自更清晰(你沒有走低谷整個應用程序找出了Session["UserDetails"]被設定)

還檢查了ASP.NET MVC 4 intercept all incoming requests(其MVC,但模塊概念/全球應用的概念還沒有ASP.NET和MVC)

+0

我不會去模塊的唯一事情就像它會熱的每個js ,我認爲將減緩這個過程的css文件請求。這就是爲什麼我搬到了處理程序 –

+0

@Robert_Junior - 那麼你唯一的選擇就是擁有某種基本頁面,所有頁面將從中繼承並覆蓋OnInit事件。 –