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; }
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); } }
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; }
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; }
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; }
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; }
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; }
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); } } } }
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); } } } }