コード例 #1
0
 public NegotiateHandler(
     IOptions <HubOptions> globalHubOptions,
     IOptions <HubOptions <THub> > hubOptions,
     IServiceEndpointManager endpointManager,
     IEndpointRouter router,
     IUserIdProvider userIdProvider,
     IServerNameProvider nameProvider,
     IConnectionRequestIdProvider connectionRequestIdProvider,
     IOptions <ServiceOptions> options,
     IBlazorDetector blazorDetector,
     ILogger <NegotiateHandler <THub> > logger)
 {
     _logger                      = logger ?? throw new ArgumentNullException(nameof(logger));
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _diagnosticClientFilter      = options?.Value?.DiagnosticClientFilter;
     _blazorDetector              = blazorDetector ?? new DefaultBlazorDetector();
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors   = globalHubOptions.Value.EnableDetailedErrors == true;
     _endpointsCount         = options.Value.Endpoints.Length;
     _maxPollInterval        = options.Value.MaxPollIntervalInSeconds;
     _transportTypeDetector  = options.Value.TransportTypeDetector;
     _customHandshakeTimeout = GetCustomHandshakeTimeout(hubOptions.Value.HandshakeTimeout ?? globalHubOptions.Value.HandshakeTimeout);
     _hubName = typeof(THub).Name;
 }
コード例 #2
0
        public void AddAzureReadsSickyServerModeFromConfigurationFirst(string modeFromConfig, ServerStickyMode expected)
        {
            using (StartVerifiableLog(out var loggerFactory, LogLevel.Debug))
            {
                var services = new ServiceCollection();
                var config   = new ConfigurationBuilder()
                               .AddInMemoryCollection(new Dictionary <string, string>
                {
                    { "Azure:SignalR:ServerStickyMode", modeFromConfig }
                })
                               .Build();
                ServerStickyMode capturedMode = ServerStickyMode.Disabled;
                var serviceProvider           = services.AddSignalR()
                                                .AddAzureSignalR(o =>
                {
                    capturedMode = o.ServerStickyMode;
                })
                                                .Services
                                                .AddSingleton <IConfiguration>(config)
                                                .AddSingleton(loggerFactory)
                                                .BuildServiceProvider();

                var options = serviceProvider.GetRequiredService <IOptions <ServiceOptions> >().Value;

                Assert.Equal(expected, capturedMode);
                Assert.Equal(expected, options.ServerStickyMode);
            }
        }
コード例 #3
0
 public NegotiateHandler(IServiceEndpointManager endpointManager, IEndpointRouter router, IUserIdProvider userIdProvider, IServerNameProvider nameProvider, IOptions <ServiceOptions> options)
 {
     _endpointManager = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router          = router ?? throw new ArgumentNullException(nameof(router));
     _serverName      = nameProvider?.GetName();
     _userIdProvider  = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _claimsProvider  = options?.Value?.ClaimsProvider;
     _mode            = options.Value.ServerStickyMode;
 }
コード例 #4
0
 public NegotiateMiddleware(OwinMiddleware next, HubConfiguration configuration, string appName, IServiceEndpointManager endpointManager, IEndpointRouter router, ServiceOptions options, IServerNameProvider serverNameProvider, ILoggerFactory loggerFactory)
     : base(next)
 {
     _configuration   = configuration;
     _provider        = configuration.Resolver.Resolve <IUserIdProvider>();
     _appName         = appName ?? throw new ArgumentNullException(nameof(appName));
     _claimsProvider  = options?.ClaimsProvider;
     _endpointManager = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router          = router ?? throw new ArgumentNullException(nameof(router));
     _logger          = loggerFactory?.CreateLogger <NegotiateMiddleware>() ?? throw new ArgumentNullException(nameof(loggerFactory));
     _serverName      = serverNameProvider?.GetName();
     _mode            = options.ServerStickyMode;
 }
コード例 #5
0
 public NegotiateHandler(
     IOptions <HubOptions> hubOptions,
     IServiceEndpointManager endpointManager, IEndpointRouter router, IUserIdProvider userIdProvider, IServerNameProvider nameProvider, IConnectionRequestIdProvider connectionRequestIdProvider, IOptions <ServiceOptions> options)
 {
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors = hubOptions.Value.EnableDetailedErrors == true;
 }
コード例 #6
0
 public NegotiateMiddleware(OwinMiddleware next, HubConfiguration configuration, string appName, IServiceEndpointManager endpointManager, IEndpointRouter router, ServiceOptions options, IServerNameProvider serverNameProvider, IConnectionRequestIdProvider connectionRequestIdProvider, ILoggerFactory loggerFactory)
     : base(next)
 {
     _configuration               = configuration;
     _provider                    = configuration.Resolver.Resolve <IUserIdProvider>();
     _appName                     = appName ?? throw new ArgumentNullException(nameof(appName));
     _claimsProvider              = options?.ClaimsProvider;
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _logger                      = loggerFactory?.CreateLogger <NegotiateMiddleware>() ?? throw new ArgumentNullException(nameof(loggerFactory));
     _serverName                  = serverNameProvider?.GetName();
     _mode = options.ServerStickyMode;
     _enableDetailedErrors = configuration.EnableDetailedErrors;
     _endpointsCount       = options.Endpoints.Length;
     _maxPollInterval      = options.MaxPollIntervalInSeconds;
 }
コード例 #7
0
 public NegotiateHandler(
     IOptions <HubOptions> hubOptions,
     IServiceEndpointManager endpointManager,
     IEndpointRouter router,
     IUserIdProvider userIdProvider,
     IServerNameProvider nameProvider,
     IConnectionRequestIdProvider connectionRequestIdProvider,
     IOptions <ServiceOptions> options,
     IBlazorDetector blazorDetector)
 {
     _endpointManager             = endpointManager ?? throw new ArgumentNullException(nameof(endpointManager));
     _router                      = router ?? throw new ArgumentNullException(nameof(router));
     _serverName                  = nameProvider?.GetName();
     _userIdProvider              = userIdProvider ?? throw new ArgumentNullException(nameof(userIdProvider));
     _connectionRequestIdProvider = connectionRequestIdProvider ?? throw new ArgumentNullException(nameof(connectionRequestIdProvider));
     _claimsProvider              = options?.Value?.ClaimsProvider;
     _diagnosticClientFilter      = options?.Value?.DiagnosticClientFilter;
     _blazorDetector              = blazorDetector ?? new DefaultBlazorDetector();
     _mode = options.Value.ServerStickyMode;
     _enableDetailedErrors = hubOptions.Value.EnableDetailedErrors == true;
     _endpointsCount       = options.Value.Endpoints.Length;
     _maxPollInterval      = options.Value.MaxPollIntervalInSeconds;
 }
コード例 #8
0
        public static IEnumerable <Claim> BuildJwtClaims(ClaimsPrincipal user, string userId, Func <IEnumerable <Claim> > claimsProvider, string serverName = null, ServerStickyMode mode = ServerStickyMode.Disabled)
        {
            if (userId != null)
            {
                yield return(new Claim(Constants.ClaimType.UserId, userId));
            }

            if (serverName != null && mode != ServerStickyMode.Disabled)
            {
                yield return(new Claim(Constants.ClaimType.ServerName, serverName));

                yield return(new Claim(Constants.ClaimType.ServerStickyMode, mode.ToString()));
            }

            var authenticationType = user?.Identity?.AuthenticationType;

            // No need to pass it when the authentication type is Bearer
            if (authenticationType != null && authenticationType != DefaultAuthenticationType)
            {
                yield return(new Claim(Constants.ClaimType.AuthenticationType, authenticationType));
            }

            // Return custom NameClaimType and RoleClaimType
            // We can have multiple Identities, for now, choose the default one
            if (user?.Identity is ClaimsIdentity identity)
            {
                var nameType = identity.NameClaimType;
                if (nameType != null && nameType != DefaultNameClaimType)
                {
                    yield return(new Claim(Constants.ClaimType.NameType, nameType));
                }

                var roleType = identity.RoleClaimType;
                if (roleType != null && roleType != DefaultRoleClaimType)
                {
                    yield return(new Claim(Constants.ClaimType.RoleType, roleType));
                }
            }

            // return customer's claims
            var customerClaims = claimsProvider == null ? user?.Claims : claimsProvider.Invoke();

            if (customerClaims != null)
            {
                foreach (var claim in customerClaims)
                {
                    // Add AzureSignalRUserPrefix if customer's claim name is duplicated with SignalR system claims.
                    // And split it when return from SignalR Service.
                    if (SystemClaims.Contains(claim.Type))
                    {
                        yield return(new Claim(Constants.ClaimType.AzureSignalRUserPrefix + claim.Type, claim.Value));
                    }
                    else
                    {
                        yield return(claim);
                    }
                }
            }
        }
コード例 #9
0
        public static IEnumerable <Claim> BuildJwtClaims(
            ClaimsPrincipal user,
            string userId,
            Func <IEnumerable <Claim> > claimsProvider,
            string serverName                   = null,
            ServerStickyMode mode               = ServerStickyMode.Disabled,
            bool enableDetailedErrors           = false,
            int endpointsCount                  = 1,
            int?maxPollInterval                 = null,
            bool isDiagnosticClient             = false, int handshakeTimeout = Constants.Periods.DefaultHandshakeTimeout,
            HttpTransportType?httpTransportType = null)
        {
            if (userId != null)
            {
                yield return(new Claim(Constants.ClaimType.UserId, userId));
            }

            if (serverName != null && mode != ServerStickyMode.Disabled)
            {
                yield return(new Claim(Constants.ClaimType.ServerName, serverName));

                yield return(new Claim(Constants.ClaimType.ServerStickyMode, mode.ToString()));
            }

            if (isDiagnosticClient)
            {
                yield return(new Claim(Constants.ClaimType.DiagnosticClient, "true"));
            }

            if (handshakeTimeout != Constants.Periods.DefaultHandshakeTimeout)
            {
                yield return(new Claim(Constants.ClaimType.CustomHandshakeTimeout, handshakeTimeout.ToString()));
            }

            var authenticationType = user?.Identity?.AuthenticationType;

            // No need to pass it when the authentication type is Bearer
            if (authenticationType != null && authenticationType != DefaultAuthenticationType)
            {
                yield return(new Claim(Constants.ClaimType.AuthenticationType, authenticationType));
            }

            // Trace multiple instances
            if (endpointsCount > 1)
            {
                yield return(new Claim(Constants.ClaimType.ServiceEndpointsCount, endpointsCount.ToString()));
            }

            if (enableDetailedErrors)
            {
                yield return(new Claim(Constants.ClaimType.EnableDetailedErrors, true.ToString()));
            }

            // Return custom NameClaimType and RoleClaimType
            // We can have multiple Identities, for now, choose the default one
            if (user?.Identity is ClaimsIdentity identity)
            {
                var nameType = identity.NameClaimType;
                if (nameType != null && nameType != DefaultNameClaimType)
                {
                    yield return(new Claim(Constants.ClaimType.NameType, nameType));
                }

                var roleType = identity.RoleClaimType;
                if (roleType != null && roleType != DefaultRoleClaimType)
                {
                    yield return(new Claim(Constants.ClaimType.RoleType, roleType));
                }
            }

            // add claim if exists, validation is in DI
            if (maxPollInterval.HasValue)
            {
                yield return(new Claim(Constants.ClaimType.MaxPollInterval, maxPollInterval.Value.ToString()));
            }

            if (httpTransportType.HasValue)
            {
                yield return(new Claim(Constants.ClaimType.HttpTransportType, ((int)httpTransportType).ToString()));
            }

            // return customer's claims
            var customerClaims = claimsProvider == null ? user?.Claims : claimsProvider.Invoke();

            if (customerClaims != null)
            {
                foreach (var claim in customerClaims)
                {
                    // Add AzureSignalRUserPrefix if customer's claim name is duplicated with SignalR system claims.
                    // And split it when return from SignalR Service.
                    if (SystemClaims.Contains(claim.Type))
                    {
                        yield return(new Claim(Constants.ClaimType.AzureSignalRUserPrefix + claim.Type, claim.Value));
                    }
                    else
                    {
                        yield return(claim);
                    }
                }
            }
        }