webAPI返回类型

时间:2016-11-28 04:39:02

标签: c# .net json

我是否应该始终返回相同的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();
    }

3 个答案:

答案 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状态代码,如资源本身不是调用者无权使用的东西。

最好不要向用户公开他们认证失败的原因。您返回给用户的信息越多,是黑客可能更不知道他们是否拥有有效用户帐户的更多信息。