C# webAPI返回类型

C# webAPI返回类型,c#,.net,json,C#,.net,Json,我是否应该始终返回相同的JSON解析对象 例如: 在网站上,用户输入用户名和密码 当用户按下Submit时,他向/api/logintest/{key}发送请求。如果用户和密码匹配,则此URL调用的方法是否应返回类似{errMsg:null}的JSON对象;如果用户和密码不匹配,则返回类似{errMsg:bad username或password}的JSON对象;或者,如果用户详细信息不匹配,我应该返回错误消息,如果找到用户,我应该返回JSON格式的用户对象 这是我的密码 [Respon

我是否应该始终返回相同的JSON解析对象

例如:

在网站上,用户输入用户名和密码

当用户按下Submit时,他向
/api/logintest/{key}
发送请求。如果用户和密码匹配,则此URL调用的方法是否应返回类似{errMsg:null}的JSON对象;如果用户和密码不匹配,则返回类似{errMsg:bad username或password}的JSON对象;或者,如果用户详细信息不匹配,我应该返回错误消息,如果找到用户,我应该返回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();
    }

依我看,它不应该返回一个body,而是返回一个HTTP401-Unauthorized

示例代码:

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

您可以做的另一件事是设置身份验证过滤器,以便在发出请求后,但在调用实际端点之前不久,检查凭据

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

…你已经准备好了

如果您想知道他们是否进行了身份验证,则可以返回:

{ "authenticated" : true } // or false
如果您想知道原因,可以记录或显示:

{ "authenticated": false, "reason" : "User account was locked" }
为了更安静,您可以选择以下路线:

GET /api/users/{userName}/authenticate
您的“快乐路径”将返回HTTP状态200和JSON消息作为响应内容

如果找不到用户(因为API调用正在查找用户资源),您可以返回404 not found的HTTP状态代码,但不需要返回401的HTTP状态代码,因为资源本身不是调用方无权使用的东西


最好的做法是不向用户公开他们明确未通过身份验证的原因。您向用户返回的信息越多,对于那些可能甚至不知道自己是否拥有有效用户帐户的黑客来说就越有用。

您看到了什么错误?您的问题不清楚。您不确定返回什么?除了这个问题之外,您不应该使用这种方式对用户进行身份验证,您应该使用身份提供商(如ADFS或identity Server)颁发的令牌对API进行身份验证