2015-12-07 14 views
5

私はASP.net 5.0(MVC 6)のWebサイトを持ち、このWebサイトを一部のモバイルアプリケーションにも使用しています。私はjsonデータを返すコントローラを持っています。ASP.net 5.0 - WebAPI 401の代わりにAuthorize&ErrorCode 302

ユーザーはこのデータを見るために認証する必要がありますので、私はコントローラの[Authorize]属性を使用します。

許可されていないリクエストに対してエラー401が発生すると予想されました。nur私はloginpageにリダイレクト(302)を取得しました。 モバイルクライアントでは、 "application/json"データのみを受け入れるようにヘッダーを設定しますが、まだログインページにリダイレクトされます。

私はうまくいくソリューションを開発しましたが、私はそれに満足していません。それは動作しますが、それは一種のハックです。

これを処理するためのより良いソリューションはありますか?ここで

私の解決策(スタートアップクラスのメソッドを設定します)

 //....Some Code 
     app.Use(async (context, next) => 
     { 
      await next.Invoke(); 

      if (context.Response.StatusCode == 302) 
      { 
       StringValues contentType; 
       if (context.Request.Headers.TryGetValue("Accept", out contentType) 
        && contentType.Contains("application/json")) 
       { 
        context.Response.StatusCode = 401; 
        if (env.IsDevelopment()) 
         await context.Response.WriteAsync("No Access"); 
       } 
      } 
     }); 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
+0

https://aspnet.uservoice.com/forums/147201-asp-net-web-api/suggestions/2856315-add-option-to-return-401-not-authorized-instead-ofによると、固定 –

答えて

2

これは、クライアントによって解決されなければなりません。クライアントは、XMLHttpRequestの値を持つX-Requested-Withヘッダーを送信する必要があります。

だから、これはHTTPリクエストのヘッダーセクションの一部でなければなりません:

X-Requested-With: XMLHttpRequest 

今、あなたはハックせずに401年代を取得します。

+0

これはdotnetコアでは機能しません。認証ミドルウェア(CookieAuthenticationMiddlewareやOpenIdConnectMiddlewareなど)にカスタムイベントを追加して、 'X-Requested-With:XMLHttpRequest'ヘッダを検出して401を返さなければなりません。 – dstj

+0

パーフェクト。それが私が探していたものです。ありがとう。 – JRoppert

関連する問題