public async Task TestRunAzureSignalRRespectValidMaxPollInterval(int timeout) { using (StartVerifiableLog(out var loggerFactory, LogLevel.Debug)) { var name = nameof(TestRunAzureSignalRRespectValidMaxPollInterval); var hubConfiguration = Utility.GetTestHubConfig(loggerFactory); var serverNameProvider = new TestServerNameProvider(name); hubConfiguration.Resolver.Register(typeof(IServerNameProvider), () => serverNameProvider); using (WebApp.Start(ServiceUrl, a => a.RunAzureSignalR(AppName, hubConfiguration, options => { options.ConnectionString = ConnectionString; options.MaxPollIntervalInSeconds = timeout; }))) { var client = new HttpClient { BaseAddress = new Uri(ServiceUrl) }; var response = await client.GetAsync("/negotiate"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var message = await response.Content.ReadAsStringAsync(); var responseObject = JsonConvert.DeserializeObject <ResponseMessage>(message); var token = JwtSecurityTokenHandler.ReadJwtToken(responseObject.AccessToken); Assert.Contains(token.Claims, x => x.Type == Constants.ClaimType.MaxPollInterval && x.Value == timeout.ToString()); } } }
public async Task GenerateNegotiateResponseWithUserIdAndServerSticky() { var name = nameof(GenerateNegotiateResponseWithUserIdAndServerSticky); var serverNameProvider = new TestServerNameProvider(name); var config = new ConfigurationBuilder().Build(); var serviceProvider = new ServiceCollection() .AddSignalR(o => o.EnableDetailedErrors = true) .AddAzureSignalR( o => { o.ServerStickyMode = ServerStickyMode.Required; o.ConnectionString = DefaultConnectionString; o.AccessTokenLifetime = TimeSpan.FromDays(1); }) .Services .AddLogging() .AddSingleton <IConfiguration>(config) .AddSingleton(typeof(IUserIdProvider), typeof(DefaultUserIdProvider)) .AddSingleton(typeof(IServerNameProvider), serverNameProvider) .BuildServiceProvider(); var httpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(CustomClaimType, CustomUserId), new Claim(ClaimTypes.NameIdentifier, DefaultUserId), new Claim("custom", "custom"), })) }; var handler = serviceProvider.GetRequiredService <NegotiateHandler>(); var negotiateResponse = await handler.Process(httpContext, "hub"); Assert.NotNull(negotiateResponse); Assert.NotNull(negotiateResponse.Url); Assert.NotNull(negotiateResponse.AccessToken); Assert.Null(negotiateResponse.ConnectionId); Assert.Empty(negotiateResponse.AvailableTransports); var token = JwtSecurityTokenHandler.ReadJwtToken(negotiateResponse.AccessToken); Assert.Equal(DefaultUserId, token.Claims.FirstOrDefault(x => x.Type == Constants.ClaimType.UserId)?.Value); Assert.Equal("custom", token.Claims.FirstOrDefault(x => x.Type == "custom")?.Value); Assert.Equal(TimeSpan.FromDays(1), token.ValidTo - token.ValidFrom); var serverName = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.ServerName)?.Value; Assert.Equal(name, serverName); var mode = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.ServerStickyMode)?.Value; Assert.Equal("Required", mode); Assert.Equal("True", token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.EnableDetailedErrors)?.Value); }
public async Task TestStickyServerInServiceOptionsTakeEffect() { using (StartVerifiableLog(out var loggerFactory, LogLevel.Debug)) { var name = nameof(TestStickyServerInServiceOptionsTakeEffect); var hubConfiguration = Utility.GetTestHubConfig(loggerFactory); var serverNameProvider = new TestServerNameProvider(name); hubConfiguration.Resolver.Register(typeof(IServerNameProvider), () => serverNameProvider); using (WebApp.Start(ServiceUrl, a => a.RunAzureSignalR(AppName, hubConfiguration, options => { options.ServerStickyMode = ServerStickyMode.Preferred; options.ConnectionString = ConnectionString; options.ClaimsProvider = context => new Claim[] { new Claim("user", "hello"), }; options.AccessTokenLifetime = TimeSpan.FromDays(1); }))) { var client = new HttpClient { BaseAddress = new Uri(ServiceUrl) }; var response = await client.GetAsync("/negotiate"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var message = await response.Content.ReadAsStringAsync(); var responseObject = JsonConvert.DeserializeObject <ResponseMessage>(message); Assert.Equal("2.0", responseObject.ProtocolVersion); Assert.Equal("http://localhost/aspnetclient", responseObject.RedirectUrl); Assert.NotNull(responseObject.AccessToken); var token = JwtSecurityTokenHandler.ReadJwtToken(responseObject.AccessToken); Assert.Equal(AppName, token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.AppName).Value); var user = token.Claims.FirstOrDefault(s => s.Type == "user")?.Value; Assert.Equal("hello", user); var serverName = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.ServerName)?.Value; Assert.Equal(name, serverName); var mode = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.ServerStickyMode)?.Value; Assert.Equal("Preferred", mode); Assert.NotNull(token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.ServerStickyMode)); var version = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.Version)?.Value; Version.TryParse(version, out var versionResult); Assert.True(versionResult > new Version(1, 0, 8)); var requestId = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.Id); Assert.Null(requestId); Assert.Equal(TimeSpan.FromDays(1), token.ValidTo - token.ValidFrom); var enableDetailedErrors = token.Claims.FirstOrDefault(s => s.Type == Constants.ClaimType.EnableDetailedErrors); Assert.Null(enableDetailedErrors); } } }