2013-12-18 7 views
7

Sunucu tarafında HttpStatusCode.Unauthorized ile yanıt verirken, istemci tarafında ajax iletisinde her zaman statusCode=200 alırım. HttpResponseMessage 401 ile her zaman başarı HttpResponseMessage 401

Benim denetleyicisi kodu:

public class AccountApiController : ApiController 
{ 
    public HttpResponseMessage Login(HttpRequestMessage request, [FromBody]LoginViewModel loginModel) 
    { 
     return request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized login."); 
    } 
} 

Benim ajax kodu:

$.ajax({ 
    url: '/api/accountapi/login', 
    type: 'POST', 
    data: data 
    }) 
    .done(function (object, status, xhr) { 
     alert("Success: " + xhr.status + " : " + xhr.statusText); 
    }) 
    .always(function (object) { 
     $("#output").text(JSON.stringify(object, null, 4)); 
    }); 

Sonuç: metin ile uyarı Success: 200 : OK ve çıkış penceresi ile: Yani

{ 
    "Message": "Unauthorized login." 
} 

, alabilirim metin hata mesajı, ancak hatayı işlemek için HttpStatusCode almam gerekiyor ifadeleri. Bana yardım et lütfen. Brock Allen bu konuda ve zarif çözümü konusunda

fazla bilgi: http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/

+0

istek/yanıt özelliklerini görüntülemek için geliştirici araçlarını kullanın. Chrome'da ağ sekmesine gidin, isteği yapın, İstek URL'sini ve Durum Kodunu inceleyin. –

+1

Elimde: 'URL iste: http: // localhost: 31757/api/accountapi/login İstek Yöntemi: POST Durum Kodu: 200 Tamam 've' X-Yanıtlı JSON: {"durum": 401, "üstbilgiler ": {" konum ":" http: \/\/localhost:? 31757 \/Hesap \/Giriş ReturnUrl =% 2Fapi% 2Faccountapi% 2Flogin "}}'. JSON cevabı, kazmak için doğru bir yol gibi görünüyor :) – Valin

cevap

6

Size HttpStatusCode.Unauthorized dönmek gibi sayfa kısa sürede form kimlik doğrulama modülü tarafından bir giriş sayfasına yönlendirdiği anlamına olabilir. MSDN

:

Tüm doğrulanmamış kullanıcıların uygulamada herhangi bir sayfaya erişimi reddedilir. Kimliği doğrulanmamış bir kullanıcı bir sayfaya erişmeye çalışırsa, form kimlik doğrulama modülü, kullanıcıyı form öğesinin loginUrl özniteliği tarafından belirtilen oturum açma sayfası 'a yönlendirir.

o 200 statü iade ediliyor, ancak kullanıcının yetkisi yok Çünkü o zaman durum kodu 200

+0

Her şey allowanonymous için ayarlanmış. Ancak sayfa yine de yönlendirme yapmıyor :( – Valin

+1

Sadece bir test olarak, StatusCode'I başka bir şeye değiştirmeye çalışın, sonra da yetkisiz bir şekilde çalışıp çalışmadığınızı görün .. Bunun, form kimlik doğrulama modülündeki tasarım gereğindendir korkuyorum –

+0

Her halükarda Unauthorize'e geri dönersiniz, dolayısıyla hepsine izin verilmez. –

6

ile servis edilir yönlendirildi ediliyor giriş sayfası, ya da her türlü sayfa, başka bir seçenek olduğunu javascript'inizde 401 durumu olan X-Yanıtlı JSON için kontrol edin.

.done(function (object, status, xhr) { 
     if (xhr.getResponseHeader("X-Responded-JSON") != null 
      && JSON.parse(xhr.getResponseHeader("X-Responded-JSON")).status == "401") { 
      //some message here 
      return; 
    } 
} 
0

Valin'in yorumunu ayrıntılandırmak ve Brock Allen'ın çözümünü satır içi hizalamak için.

ipucu içten form giriş için yönlendirme hapseden döndü Tamam yanıt yatıyor: Bunun yerine bu iç hata durumu için yanıtını kazıma, sunucuda düzeltmek isterseniz

X-Responded-JSON: {"status": 401, "headers": {"location":"http:\/\/localhost:50004\/Login?ReturnUrl=%2FClient"}}

, sen Using cookie authentication middleware with Web API and 401 response codes üzerinde Brock Allen 'in makalesinden çözümü kullanabilirsiniz: çerez kimlik doğrulama katman kullanarak sunucu (MVC veya WebForms) bir 401 yayımladığında, Normalde

ardından yanıtı 302 dönüştürülür yeniden giriş sayfasına yönlendirin (CookieAuthenticationOptions'daki LoginPath tarafından yapılandırıldığı gibi). Ancak bir Ajax çağrısı yapıldığında ve yanıt bir 401 olduğunda, giriş sayfasına bir 302 yönlendirmesi dönmek mantıklı olmaz. Bunun yerine, 401 cevabının geri gönderilmesini beklersiniz.Ne yazık ki bu biz çerez katman ile elde davranış değildir - yanıtı bir mesajla bir JSON yanıt gövdesinde 200 durum kodu olarak değiştirilir:

{"Message":"Authorization has been denied for this request."} 

Ben gereksinimi bu özellik için ne emin değilim . çerez kimlik doğrulama katman üzerinde CookieAuthenticationProvider yapılandırarak 401 Yetkisiz yanıt olduğunda bunu değiştirmek için, davranışın kontrolünü ele geçirmek gerekir:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/Account/Login"), 
    Provider = new CookieAuthenticationProvider 
    { 
     OnApplyRedirect = ctx => 
     { 
     if (!IsAjaxRequest(ctx.Request)) 
     { 
      ctx.Response.Redirect(ctx.RedirectUri); 
     } 
    } 
    } 
}); 

Bildirim o OnApplyRedirect olayını işler. Arama bir Ajax çağrısı olmadığında yönlendiririz. Aksi takdirde, 401'in arayan kişiye geri gönderilmesine izin veren hiçbir şey yapmayız.

IsAjaxRequest onay basitçe katana projede helper kopyalanır:

private static bool IsAjaxRequest(IOwinRequest request) 
{ 
    IReadableStringCollection query = request.Query; 
    if ((query != null) && (query["X-Requested-With"] == "XMLHttpRequest")) 
    { 
     return true; 
    } 
    IHeaderDictionary headers = request.Headers; 
    return ((headers != null) && (headers["X-Requested-With"] == "XMLHttpRequest")); 
}