2013-07-05 11 views
13

Sadece kimlik doğrulamayı etkinleştirmeye çalıştığımda gerçekleşen OWIN ile birlikte SignalR ile kendi kendine hosting yaparken bir CORS sorunum var.Kendiliğinden barındırma ve kimlik doğrulaması ile SignalR etki alanları arası bağlantılar

benim web tarayıcısında olsun hatadır: ... http://.../signalr/negotiate?[snip] Origin yükleyemiyor

XMLHttpRequest Erişim-Control-Allow-Origin tarafından izin verilmez Bu yalnızca I olur

this answer yılında yaklaşımını kullanarak kendi kendine barındırılan sunucudaki kimlik doğrulamayı etkinleştirmek:

public void Configuration(IAppBuilder app) 
{ 
    var listener = (HttpListener)app.Properties[typeof(HttpListener).FullName]; 
    listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm; 

    app.MapHubs(new HubConfiguration { EnableCrossDomain = true }); 
} 

Bendışarı yorum yaparsanızhattı sonra CORS çalışır (ve ben her şeyi kontrol ettim these instructions). NTLM'den başka kimlik doğrulama şemaları kullanırsam aynı sorunu yaşıyorum.

Access-Control-Allow-Kimlik: true
Erişim control- ne incelemek için Fiddler kullanarak

kimlik Gerekli CORS başlıkları sunucusundan geri geliyor bkz etkin olmadan oluyor Allow-Origin: [benim sunucu]

Ben kimlik doğrulamayı etkinleştirmek kez Ancak bu başlıkları eksik bir 401 yanıt almak. Tüm isteklerde gerekli Origin başlığı var.

SignalR source code'u incelediğimizde, başlıklar ayarlanmış gibi görünüyor, ancak muhtemelen kimlik doğrulaması etkinleştirildiğinde, HttpListener, bu koda çarpmadan ilk 401 yanıtını gönderiyor.

Sanırım sorum şu: Kimlik doğrulama protokolleri anlaşmasında Access-Control-Allow-Origin başlığını eklemek için HttpListener'u nasıl alabilirim?

+0

Bundan daha fazlasını yaptınız mı? Ben aynı sorunu yaşıyorum ... –

cevap

4

Ön uçuş taleplerini anonim erişime izin vererek, OWIN'de kendiliğinden barındırılan çapraz etki alanı sinyaliR ile çalışmak için NTLM kimlik doğrulaması aldım.

Yapılması gereken, ön kontrol isteği başlıklarını arayan kimlik doğrulama şemasını seçmek için bir temsilci oluşturmak ve bunların anonim olarak kullanılmasına izin vermek. Diğer tüm isteklerde NTLM kullanılacaktır.

public void Configuration(IAppBuilder appBuilder) 
{ 
    var listener = (HttpListener)appBuilder.Properties[typeof(HttpListener).FullName]; 
    listener.AuthenticationSchemeSelectorDelegate += AuthenticationSchemeSelectorDelegate; 
} 

private AuthenticationSchemes AuthenticationSchemeSelectorDelegate(HttpListenerRequest httpRequest) 
{ 
    if (httpRequest.Headers.Get("Access-Control-Request-Method")!=null) 
     return AuthenticationSchemes.Anonymous; 
    else 
     return AuthenticationSchemes.Ntlm; 
} 
+0

Öneri için teşekkürler!Umut verici bir cadde gibi görünüyor, ancak tarayıcımın önkoşul istekleri yapmıyor gibi görünüyor. Bu bana neredeyse benzer bir şey elde eden UnsafeConnectionNtlmAuthentication özelliğini bulmama ilham verdi (ilk istek CORS gerektirmeyen bir kaynaktır ve sonraki istekler ilk önce kimlik doğrulamasını yeniden kullanır). Ancak bu bir süreliğine sonra düşer, çünkü kimlik bilgileri TCP bağlantısı başına önbelleğe alınır ve istemcim açıkça birden fazla bağlantıyı açmaya başlar. Yine de bir hack. Denemeye devam edeceğim ... –

+0

Çok teşekkür ederim! Bunu işe almaya çalışırken saçlarımı yırtıyordum. –

3

bunu çok unhelpfully bu başlıklar eksik olduğunu söyler Chrome, kullandığınız tahmin ve bu sorun olduğunu, aslında muhtemelen sadece unuttum ne zaman true için XMLHttpRequest 'ın withCredentials özelliğini ayarlamak için. jQuery kullanıyorsanız

Eğer tüm istekleri için bunu yapabilirsiniz:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    options.xhrFields = { withCredentials: true }; 
}); 

Ayrıca diğer yanıtında olduğu gibi OPTIONS istekleri ile doğru olanı yapmak gerekir.

İlgili konular