2015-11-30 27 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事件。 –