2016-11-28 19 views
4

は、私はいつも同じJSONに解析されたオブジェクトを返すべきかWEBAPIの戻り値の型

例:ウェブサイト上

は、ユーザーが自分のユーザー名とパスワードを入力します。

ユーザがを押すと、に送信され、/api/logintest/{key}に要求が送信されます。このURLで呼び出されたメソッドは、ユーザーとパスワードが一致する場合は{errMsg:null}、そうでない場合は{errMsg: "bad username or password"}のようなJSONオブジェクトを返します。ユーザーの詳細が一致しない場合はエラーメッセージが返され、ユーザーが見つかった場合はJSONでユーザーオブジェクトが返されます。

//if the user is null then we return the err message 
if (userReturn == null) 
    return Unauthorized(); 
+0

どのようなエラーが表示されますか? – Prescott

+0

あなたの質問は不明です。何を返すのか分からないのですか? – Vinoth

+1

問題を解決するには、この方法でユーザーを認証しないでください。ADFSやIdentity ServerなどのIDプロバイダーによって発行されたトークンを使用してAPIを認証する必要があります –

答えて

1

IMO私のコードですdoは認証フィルタが設定されているため、要求が行われた後で実際のエンドポイントが呼び出される直前に資格情報がチェックされます。

public class AuthenticationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Your validation logic here. 
    } 
} 

次にFilterConfig.csでそれを設定:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new AuthenticationFilter()); 
    } 
} 

を...そして、あなたが設定されています!

1

することができますもう一つは:不正な

サンプルコード -

これ

は、それが体を返す代わりに、HTTP 401を返すべきではありません、

[ResponseType(typeof(User))] 
    [HttpPost] 
    [Route("api/logintest/{key}")] 
    public IHttpActionResult LoginTest(LoginForm luser , String key) 
    { 
     //test the api key 
     if(key == "jordanisthebest") 
     { 
      //we try to get the user by his username and password 
      User userReturn = UsersManager.getUserByEmailAndPassword(new User { Email = luser.Email, Password = luser.Password }); 

      //if the user is null then we return the err message 
      if (userReturn == null) 
       ModelState.AddModelError("Email", "Bad email or password"); 

      //if model state is not good we send err msg 
      if (!ModelState.IsValid) 
       return Ok(ModelState.getListErrorAndKey(null, typeof(LoginForm))); 

      //if all good we return the user 
      return Ok(userReturn); 
     } 

     return NotFound(); 
    } 
1

あなたは、彼らが認証した場合、その後、あなたが返すことができるかを知りたい場合は、次の

{ "authenticated" : true } // or false 

をあなたがそれをログに記録するかを表示することができますので、その理由を知りたい場合は、次の

{ "authenticated": false, "reason" : "User account was locked" } 

へあなたのルートを作ることができます:

GET /api/users/{userName}/authenticate 

あなたの "ハッピーパス"は、HTTPステータス200を返します。応答内容としてのJSONメッセージ。

ユーザーが見つからない場合(API呼び出しがユーザーリソースを検索しているため)、404のHTTPステータスコードを返すことができますが、HTTPステータスコード401を返す必要はありません。リソースそのものは、発信者が使用を許可されていないものではないためです。

特に認証に失敗した理由をユーザーに公開しないことをお勧めします。あなたがユーザーに返す情報が増えると、有効なユーザーアカウントを持っているかどうかわからないハッカーの情報が増えます。