首页 > 解决方案 > 如何将应用程序会话保持在同一域上?

问题描述

关于 JWT 身份验证,我已经研究了大约一个月的问题。我有多个使用 Owin 的 Asp.net MVC 4.5 应用程序,这些应用程序部署在同一台机器上,并且使用带有集成管道的 IIS 具有不同的子域。我的问题是,当我登录到一个应用程序并浏览到另一个应用程序时,它不会重新验证并自动允许用户通过授权过滤器。

我尝试将 cookie 策略设置为严格,并将 cookie 域、路径和名称设置为不同的值,但无法解决此问题。

我有一个自定义身份验证库,这些应用程序中的每一个都使用它。我希望你能帮忙。

我想要发生的是每个应用程序都维护自己的身份验证会话,并且仅仅因为用户针对 AD 域进行了身份验证,它要求用户重新授权以确保他们可以访问特定的应用程序。

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
      CookieName = $"{tenantId}{clientId}"
 })
   .UseOpenIdConnectAuthentication(GetAuthenticationOptions(clientId, tenantId, clientSecret));

private static OpenIdConnectAuthenticationOptions GetAuthenticationOptions(string clientId, string tenantId, string clientSecret)
{
     return new OpenIdConnectAuthenticationOptions
     {
          MetadataAddress = string.Format("https://login.microsoftonline.com/{0}/.well-known/openid-configuration", tenantId),
          ClientId = clientId,
          ClientSecret = clientSecret,
          ResponseType = "id_token token",
          Resource = "https://graph.microsoft.com",
          UseTokenLifetime = true,
          AuthenticationMode = AuthenticationMode.Active,
          Notifications = new OpenIdConnectAuthenticationNotifications
          {
               SecurityTokenValidated = SecurityTokenValidated
          },
          TokenValidationParameters = new TokenValidationParameters
          {
               NameClaimType = "mailNickName",
          }
     };
}

标签: asp.net-mvc-4iis

解决方案


尝试将 web.config 中“sessionState”XML 元素的“cookieName”属性设置为每个应用程序的不同值。这将阻止他们使用相同的会话 ID。

<system.web>
    <sessionState regenerateExpiredSessionId="false" cookieless="UseCookies" cookieName="id" />
</system.web>

sessionState 元素


推荐阅读