我是否应该始终返回相同的JSON解析对象
示例:
在网站上,用户输入他的用户名和密码。
当用户按提交时,他向/api/logintest/{key}
发送请求。如果用户和密码匹配,则此URL调用的方法应返回{errMsg:null}之类的JSON对象,如果不匹配,则返回{errMsg:“错误的用户名或密码”};或者如果用户详细信息不匹配则返回错误消息,如果找到用户则返回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 :(得分:1)
IMO,它不应该返回一个正文,而是返回一个HTTP 401 - Unauthorized
示例代码:
//if the user is null then we return the err message
if (userReturn == null)
return Unauthorized();
答案 1 :(得分:1)
您可以做的另一件事是设置身份验证过滤器,以便在发出请求后检查凭据,但在调用实际端点之前不久。
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());
}
}
......你已经定下来了!
答案 2 :(得分:1)
如果您想知道他们是否经过身份验证,那么您可以返回:
{ "authenticated" : true } // or false
如果您想知道原因,那么您可以记录或显示它:
{ "authenticated": false, "reason" : "User account was locked" }
为了更加RESTful,您可以制定路线:
GET /api/users/{userName}/authenticate
您的“快乐路径”会返回HTTP状态200和JSON消息作为响应内容。
如果找不到用户(因为API调用正在寻找用户资源),您可以返回未找到404的HTTP状态代码,但是不需要返回401的HTTP状态代码,如资源本身不是调用者无权使用的东西。
最好不要向用户公开他们认证失败的原因。您返回给用户的信息越多,是黑客可能更不知道他们是否拥有有效用户帐户的更多信息。