2016-11-28 63 views
4

我就应该总是返回相同的JSON解析的对象或不的WebAPI返回类型

例子:

在网站上,用户输入自己的用户名和密码。

当用户按提交他发送请求/api/logintest/{key}。如果用户和密码匹配,该URL所调用的方法是否会返回像{errMsg:null}这样的JSON对象,如果不匹配,则返回{errMsg:“bad username or password”};或者如果用户的详细信息不匹配,我应该返回并显示错误消息,如果找到用户,则返回JSON中的用户对象?

这是我的代码

[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(); 
    } 
+0

你看到了什么错误? – Prescott

+0

你的问题不清楚。你不确定要返回什么吗? – Vinoth

+1

远离这个问题,您不应该使用这种方式来验证用户身份,您应该使用由身份提供者(例如ADFS或Identity Server)发出的令牌来验证您的API –

回答

1

IMO,它不应该返回一个身体而是返回一个HTTP 401 - 未授权

示例代码:

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

另一件事,你可以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

如果你想知道他们是否验证,那么你可以返回:

{ "authenticated" : true } // or false 

如果你想知道原因,所以你可以登录它或将其显示:

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

要更加RESTful,你可以让你的路线:

GET /api/users/{userName}/authenticate 

你的“快乐的路径”将返回一个HTTP状态200和JSON消息作为响应内容。

如果找不到用户(因为API调用正在查找用户资源),您可能会返回未找到404的HTTP状态码,但不需要返回HTTP状态码401,因为资源本身不是调用者未被授权使用的东西。

不暴露给用户为什么他们明确地认证失败是一个好习惯。您返回给用户的信息越多,黑客的更多信息也可能不知道他们是否拥有有效的用户帐户。