Шаткая связь между клиентом javascript SignalR и ядром .net core - PullRequest
0 голосов
/ 30 декабря 2018

Мой клиент JavaScript SignalR регулярно подключается к моей базовой реализации asp.net IdentityServer4.

На клиенте я вижу:

Information: WebSocket connected to wss://localhost:5001/signal/satellite?
idsrv.session=4ec93d2f4c3b9a970ff82a537ae04d97&id=0eUBg2-xobp4CNttuIQJcg

Но, это также не связывает большую часть времени, с ошибкой, что в JSON был неожиданный токен в позиции 0.

Кажется, что он немного работает хорошо, а затем плохо, даже если я перехожу, он все равно выдает ошибку.В браузере вызов всегда выглядит примерно так:

https://localhost:5001/signal/satellite?
idsrv.session=89364018a975e4fefff9ad0869b1ae09

Мне не нужно промежуточное программное обеспечение для него, чтобы переместить значение строки запроса в заголовок, я все еще получаю пользователя в своем хабево время onConnect с их подпретензией и т. д. Однако, если я вставлю промежуточное программное обеспечение перед app.UseAuthentication () и наблюдаю:

context.Request.QueryString.Value

, когда оно успешно установит связь с сервером, я вижу:

idsrv.session=89364018a975e4fefff9ad0869b1ae09

но когда это не так, я вижу это:

? Client_id = internal & redirect_uri = https% 3A% 2F% 2Flocalhost% 3A5001% 2Fsignin-oidc & response_type = code% 20id_token & scope = openid% 20profile% 20offline_access% 20Harvey & response_mode = form_post & Nonce = 636817245670169226.ZWM2OWQ0ZWEtOTQzMC00YTJlLWI4MzQtYmIxZDZjOWVlYjg5ZTA4NTU2M2QtNjczZi00MTlmLThjYmQtZWUzZTQ1ODMzNDQ0 & состояние = CfDJ8MCxOjJiJLdKqZrnPwOHDhqMnzWz6MqRb03SxToClqQ1F3n9g8yLdW683HRpZSHd-5wkN-6je4tHJkA8sc5i6YoKRxtMHwnWqxVW5-nXFaaH0TfOLUeqfxDzXLxnftmWFXLjK3Y7b6R2WzcDLEjChU1_Fk6X64SAHNRqeizGDPzRhxpV0U5w19Bbt7pUyRbYymn2WNedCS1F7g_wtwtJXDjCzWKBxqvPZ5Dtg99gxKkANalKYs7C4-fm7YdD0gFvsuV4CXsu0T06MjzID_zpA_F7TmSue4vGI-0_qY55Swc5mbLWUwKHtj6ZTfOG4UmTEP_hbj2PO9w2oNg9TWqTPtDC3-qSl1fTUkY0EtCwbA7F и х-клиент-ы = ID_NETSTANDARD1_4 & х-клиент-версия = 5.2.0.0

1020 * поэтому я застрял или не нуждаясь, чтобы сделать это, потому что он преуспевает на своей собственной или QueryString никогда не делаетк промежуточному программному обеспечению для перемещения (возможно, именно поэтому оно не может сделать это самостоятельно)

Чего мне не хватает, чтобы он работал последовательно?

Добавление гибридного клиента в IdentityServer4:

        new Client
        {
            ClientId = "mvc",
            ClientName = "MVC Client",
            AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

            ClientSecrets = 
            {
                new Secret("secret".Sha256())
            },

            RedirectUris = { "http://localhost:5002/signin-oidc" },
            PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },

            AllowedScopes = 
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                "api1"
            },
            AllowOfflineAccess = true
        }

и затем при запуске на клиенте mvc:

 ServiceCollection.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "https://localhost:5001";
                options.RequireHttpsMetadata = false;
                options.ClientSecret = "secret";
                options.ClientId = "mvc";

                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("offline_access");
                options.Scope.Add("api1");
                options.ClaimActions.MapJsonKey("website", "website"); 
            });

Это смоделировано по примеру: Quickstart5_HybridAndApi

В SignalR на сервере:

        [Authorize]
        public class SignalRSignalHub : Hub
        {
            public override Task OnConnectedAsync()
            {
                var context = Context.GetHttpContext();
                return base.OnConnectedAsync();
            }
        }

Клиент JavaScript SignalR:

    self.signalRConnection = new signalR.HubConnectionBuilder()
.withUrl("/signal/satellite?" + document.cookie).build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...