【问题标题】:SessionAuthenticationModule with Windows Authentication带有 Windows 身份验证的 SessionAuthenticationModule
【发布时间】:2014-03-20 20:22:02
【问题描述】:

我正在使用 Windows 身份验证,因为我的 ASP.NET MVC 5 应用程序正在 Intranet 中运行(Active Directory 是主要的声明发布者)。

由于每次请求时 AD 和浏览器之间不断进行 401 握手,因此网站速度相当慢。

我现在正在寻找一种方法来缓存从 AD 收到的声明,以便获得一些性能提升。

这对 WIF 和 SessionAuthenticationModule 是否可行?一旦生成 SessionSecurityToken,它会停止对 AD 的后续请求吗?在 ASP.NET 管道中创建此类令牌的最佳位置是什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc wif claims-based-identity


    【解决方案1】:
    1. 是的,SAM 是可行的
    2. 是的,您不必在初始转换后每次都点击 AD

    你应该做的是这个

    1. 在您的站点上实施 ClaimsAuthenticationManager。这将拦截您的第一个请求并接收您的初始 ClaimsPrincipal。最初的 ClaimsPrincipal 将只包含您的用户名和您的 AD 组的 SID。

    2. 在您的 ClaimsAuthenticationManager 实现中,您将从 AD 读出您的应用程序特定声明并创建一个新的转换后的 ClaimsPrincipal。然后将其序列化为 Auth Cookie。

    3. SAM 将拦截后续请求,您无需像第一次那样从 AD 进行声明转换。

    这就是你的做法:

    1. 像这样创建一个 ClaimsAuthenticationManager:

      public class AdClaimsAppender : ClaimsAuthenticationManager
        {
          public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
      {
            if (!incomingPrincipal.Identity.IsAuthenticated)
            {
                return base.Authenticate(resourceName, incomingPrincipal);
            }
            var adClaims = GetExtraAdClaims(incomingPrincipal);
            var newClaimsIdentity = new ClaimsIdentity(adClaims, "Windows");
            var newClaimsPrincipal = new ClaimsPrincipal(newClaimsIdentity);
           return base.Authenticate(resourceName, newClaimsPrincipal);
      }
      

      } }

    2. 将 SAM 模块添加到您的网络配置中

          <system.webServer>
          <modules>
          <add name="SessionAuthenticationModule"
                  type="System.IdentityModel.Services.SessionAuthenticationModule,  System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089" preCondition="managedHandler"/>
           </modules>
          </system.webServer>
      
    3. 在全局 asax 中设置 SAM cookie

      using System.IdentityModel.Services;
       using System.IdentityModel.Services.Configuration;
      
      
      public class MvcApplication : HttpApplication
      {
          protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
              FederatedAuthentication.FederationConfigurationCreated += FederatedAuthentication_FederationConfigurationCreated;
        }
      
      private static void FederatedAuthentication_FederationConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
      {
          //from appsettings...
          const string domain = "";
          const bool requireSsl = false;
          const string authCookieName = "YourSiteAuth"; //default is fedauth, i normally create my own name as it is easier to identify when you have a lot of cookies.
      
          e.FederationConfiguration.CookieHandler = new ChunkedCookieHandler
              {
                  Domain = domain,
                  Name = authCookieName,
                  RequireSsl = requireSsl,
                  PersistentSessionLifetime = new TimeSpan(0, 0, 30, 0)
              };
      }
      

    【讨论】:

    • 你把 AdClaimsAppender 挂在哪里?
    • e.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager = new AdClaimsAppender();
    • 当我第一次开始阅读您的回答时,我怀有希望。但是,唉,这对我也不起作用。
    猜你喜欢
    • 2015-09-09
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多