Шаткая связь между клиентом javascript SignalR и внутренним ядром.net

Мой клиент 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= внутренний &redirect_uri= HTTPS%3A%2F%2Flocalhost%3A5001%2Fsignin-РСИН &response_type= код%20id_token& Объем = 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& х -client-ы =ID_NETSTANDARD1_4& х-клиент-вер =5.2.0.0

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

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

Добавить гибридного клиента в 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();

0 ответов

Другие вопросы по тегам