Код состояния SignalR 403 при рукопожатии транспорта веб-сокета

Я сопоставляю signalR в Web Api с помощью следующего кода в классе Startup.cs

public void Configuration(IAppBuilder app)
    {

        ConfigureAuth(app);
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableDetailedErrors= true,
                EnableJSONP=true
            };
            map.RunSignalR(hubConfiguration);
        });
    }

Наряду с этим я использовал аутентификацию токена на предъявителя и аутентификацию файлов cookie в Web Api, используя следующий код

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            AuthenticationMode = AuthenticationMode.Active,
            CookieHttpOnly = true,
            CookieSecure = CookieSecureOption.SameAsRequest,
            CookiePath = "/",
            CookieDomain = "xxxx.cloudapp.net",
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true,
        };

        app.UseOAuthBearerTokens(OAuthOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
        {
            Provider = new QueryStringOAuthBearerProvider("Token")
        });

Веб-API находится в другом домене, поэтому я включил Cors для вызовов Api, выполнив следующий код

public static void Register(HttpConfiguration config)
    {
        var cors = new    EnableCorsAttribute("http://localhost:8080,http://www.myweb.com,http://myweb.com", "*", "*");
        cors.SupportsCredentials = true;
        config.EnableCors(cors);   
     ......
     ......
     }

Теперь при подключении со стороны клиента я получаю следующую ошибку в консоли

Код статуса SignalR 403

Вот ответ, который я получаю, соответствующий рукопожатию веб-сокета

введите описание изображения здесь

Пожалуйста, расскажите об этом.


person Vikas Nokhwal    schedule 13.04.2016    source источник
comment
Убедитесь, что у вас есть активированный / поддерживающий веб-сокет в вашем приложении (сервере) Web Api.   -  person Erkan Demirel    schedule 13.04.2016
comment
он включен в облачной службе   -  person Vikas Nokhwal    schedule 13.04.2016
comment
не уверен, связано ли это с этим, но если вы используете framework 4.5, вы установили ‹add key = aspnet: UseTaskFriendlySynchronizationContext value = true /› в теге web.config ›appSettings   -  person Ronak Patel    schedule 03.05.2016


Ответы (1)


Я знаю, что это старый вопрос, но у меня была такая же проблема, поэтому на будущее, если кто-то еще наткнется на него ...

Как-то так:

CookieSecure = CookieSecureOption.SameAsRequest,

это проблема. Не работает как надо (не знаю почему) ...

Это моя конфигурация файлов cookie:

            builder.Register(ctx => new CookieAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
                CookieName = "xxx",
                CookieHttpOnly = false, // Kako bi mu mogli pristupiti iz Javascripta
                ExpireTimeSpan = TimeSpan.FromDays(1),
                LoginPath = PathString.Empty,
                LogoutPath = PathString.Empty,
                SlidingExpiration = true,
#if DEBUG
                CookieSecure = CookieSecureOption.SameAsRequest,
#else
                CookieSecure = CookieSecureOption.Always,
#endif
                CookieDomain = "localhost"
            });

и это моя конфигурация токена

            builder.Register(ctx => new OAuthAuthorizationServerOptions
            {
                AuthorizeEndpointPath = new PathString("/api/authorize"),
                TokenEndpointPath = new PathString("/api/token"),
                ApplicationCanDisplayErrors = true,
                Provider = ctx.Resolve<ApplicationOAuthProvider>(),
                //RefreshTokenProvider = ctx.Resolve<ApplicationRefreshTokenProvider>(),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
#if DEBUG
                AllowInsecureHttp = true
#endif
            });

После размещения моего приложения на локальном хосте HTTPS оно автоматически заработало. Почему? Все еще не знаю: P

person Franz1986    schedule 19.06.2017