Ejemplo n.º 1
0
        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());
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }