是否可以在同一站点上的两个Web应用程序之间共享AAD身份验证cookie

时间:2017-10-12 15:40:14

标签: asp.net-mvc azure signalr owin-middleware azure-authentication

问题 后端网络应用是否可以接受并通过登录前台生成的AAD身份验证Cookie中获取用户身份-END-web的应用程序?

背景 我想为JavaScript SignalR客户端实现Azure Active Directory单点登录体验,但我当前的解决方案要求用户登录两次。一旦访问托管js-client的Web应用程序,然后再次访问,以便js-client-app可以访问后端。

使用SSO AAD身份验证

所需解决方案

  1. 前端(OWIN / MVC / JavaScript)
    • 用于识别用户的AAD身份验证 - 已实施
    • JS SignalR客户端在服务器请求中包含auth cookie - 默认工作
  2. 后端(OWIN / SignalR PersistentConnection)
    • 通过SignalR请求中包含的前端身份验证中的加密.AspNetCookies cookie识别用户。
    • 不接受cookie,OWIN的调试输出是Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware警告:0:取消保护票证失败
  3. 尝试后端Startup.cs

    public void ConfigureAuth( IAppBuilder app )
       app.SetDefaultSignInAsAuthenticationType( CookieAuthenticationDefaults.AuthenticationType);
       app.UseCookieAuthentication(new CookieAuthenticationOptions());
       app.UseOpenIdConnectAuthentication(
           new OpenIdConnectAuthenticationOptions
               {
                  ClientId = clientId,
                  Authority = authority,
                  RedirectUri = redirectUri,
                  PostLogoutRedirectUri = redirectUri,
                  TokenValidationParameters = new TokenValidationParameters
                  {
                     RoleClaimType = "roles"
                  }
                });
    }
    

    当前解决方案,包含不良双重符号

    1. 前端网络应用(OWIN / MVC / JavaScript)
      • Owin处理AAD身份验证
      • MVC根据经过身份验证的用户
      • 生成视图
      • ADAL JS处理用户身份验证客户端并获取作为cookie添加的访问令牌(my_access_token)
    2. 后端网络应用(OWIN / SignalR PersistentConnection)
      • OWIN通过提取my-_access_token cookie中的访问令牌并将其添加为Bearer Authorization标头来处理身份验证
      • 通过覆盖基于经过身份验证的用户的 PersistentConnection 中的授权功能来处理授权
    3. 当前的前端Startup.cs

      public void ConfigureAuth( IAppBuilder app )
         GlobalFilters.Filters.Add( new AuthorizeAttribute() );
         app.SetDefaultSignInAsAuthenticationType( CookieAuthenticationDefaults.AuthenticationType);
         app.UseCookieAuthentication(new CookieAuthenticationOptions());
         app.UseOpenIdConnectAuthentication(
             new OpenIdConnectAuthenticationOptions
                 {
                    ClientId = clientId,
                    Authority = authority,
                    RedirectUri = redirectUri,
                    PostLogoutRedirectUri = redirectUri,
                    TokenValidationParameters = new TokenValidationParameters
                    {
                       RoleClaimType = "roles"
                    }
                  });
      }
      

      当前后端Startup.cs

      public void Configuration( IAppBuilder app ){
         app.Use( ( context, next ) =>
             {
                if (context.Request.Cookies.Any(c => c.Key.Equals("BearerToken")))
                {
                  var cookie = context.Request.Cookies.First(c => c.Key.Equals("BearerToken"));
                  context.Request.Headers.Add("Authorization", new[] { $"Bearer {cookie.Value}" });
                }
      
                 return next.Invoke();
              });
      
          app.UseWindowsAzureActiveDirectoryBearerAuthentication(
              new WindowsAzureActiveDirectoryBearerAuthenticationOptions
              {
                 Tenant = tenant,
                 TokenValidationParameters = new TokenValidationParameters
                                               {
                                                   ValidAudience = audience,
                                                   RoleClaimType = "roles"
                                                }
              };
           );
      }
      

1 个答案:

答案 0 :(得分:0)

是的,有可能。您需要为Cookie加密和解密指定共享密钥。 https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-3.1

添加了AzureAd后,您只需从两个应用程序中的同一键中注入具有共享cookie名称和dataProtectionProvider的共享cookie设置。