2016-11-18 10 views
0

Angularクライアントは、ユーザーがパスワードとユーザー名で承認されているかどうかを確認するWeb API関数を呼び出します。ここでは、メソッドの関連開始:

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin"); 
     var userManager = context.OwinContext.Get<DividendsManagerUserManager>(); 

     if (allowedOrigin == null) allowedOrigin = "*"; 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

     var user = await userManager.FindAsync(context.UserName, context.Password); 
     if (user == null) 
     { 
      context.SetError("invalid_grant", "Der Benutzername oder das Passwort ist ungültig."); 
      return; 
     } 

私が使用するcontext.SetErrorは、提供されたログインが無効な場合に使用します。そうすることで、このメッセージは、フィドラーで見られるように返します。

HTTP/1.1 400 Bad Request 

のCache-Control:キャッシュなし プラグマ:キャッシュなし のContent-Type:アプリケーション/ JSON;のcharset = UTF-8 有効期限:-1 サーバー:マイクロソフト-IIS/10.0 アクセス制御 - 許可 - 起源:* X-Poweredのバイ:ASP.NET 日:金、2016年11月18日午前12時49分10秒GMT のContent-Length:97

{"error": "invalid_grant"、 "error_description": "BenutzernameまたはPasswort isungültig"}

いいですね。成功関数コールバックが実行されるので、しかし角度で、APIコールは、 "成功":

 var _login = function(loginData) { 
 

 
      var data = "grant_type=password&username=" + loginData.userName + "&password=" + loginData.password + "&client_id=" + authSettings.clientId; 
 

 
      var deferred = $q.defer(); 
 

 
      $http.post(serviceBase + 'token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function(response) { 
 

 
       localStorageService.set('authorizationData', { token: response.access_token, userName: loginData.userName, refreshToken: response.refresh_token, useRefreshTokens: true }); 
 

 
       fillAuthData(); 
 

 
       deferred.resolve(response); 
 

 
      }).error(function(err, status) { 
 
       _logOut(); 
 
       deferred.reject(err); 
 
      }); 
 

 
      return deferred.promise; 
 
     };

誰もが間違っwents知っていますか?

よろしく、

トルステン

P.S:レスポンスがエラーが含まれている場合、成功の機能の中で私がチェックできます。しかし、それは悪いハックのように感じる。

+0

使用しているanglejsのバージョンはどれですか? –

+0

バージョン1.5.8を使用しています。 – user2145393

+0

'.success(...)。error(...)'の代わりに '.then(...)。catch(...)'を使ってテストできますか?これらのメソッドは、このバージョンのangularjでは非推奨です。 –

答えて

0

エラーの原因が見つかりました。私は迎撃器を書いた。私の意図は、インターセプタに注入したサービスのプロパティを設定することだけでした。このため、私はどのような方法で拒絶反応を操作していなかったし、ちょうどこのようにそれを通過:

function responseError(rejection) { 
 
      busyService.isBusy = true; 
 

 
      return rejection; 
 
     }

しかし、これは$ http.postを成功させるように思われます。

私はこれを行う場合は$ http.postエラー(欲しかったもの)である:私はまだ理由を知らないと、さらに調査する必要があります

 function responseError(rejection) { 
 
      busyService.isBusy = true; 
 

 
      var deferred = $q.defer(); 
 
      deferred.reject(rejection); 
 
      return deferred.promise; 
 
     }

。誰かがさらに説明できれば、これはいいだろう。約束チェーンで

0

、拒否はは拒否ハンドラに値を返すことで、成功を変換することができます。これにより、問題を修正して操作を再試行することができます。しかし、望ましくないコンバージョンに関連するバグにつながる可能性もあります。

不要な変換の最も一般的な原因の1つは何を返すかスローに失敗して
promise.then(function successHandler(value) { 
    //return to chain value 
    return value; 
}).catch(function rejectHandler(errorValue) { 
    //to avoid conversion 
    //throw to chain rejection 
    throw errorValue; 
    //OR return rejected promise 
    //return $q.reject(errorValue); 
}); 

//ERRONEOUS 
function responseError(errorResponse) { 
    console.log(errorResponse.status); 
}  

上記の例では、拒否ハンドラは、誤って成功に拒絶反応を変換します。関数がreturnステートメントまたはthrowステートメントを省略すると、関数はundefinedを返します。これにより、却下が成功して解決され、値はundefinedになります。

誤った変換をデバッグするときは、拒否ハンドラを確認してください。次に、間違って動作するインターセプタを探します。

関連する問題