2013-02-19 99 views
5

我正在使用ASP.NET Web Api编写验证密码服务。REST验证密码服务

服务接受当前登录用户的密码,验证它并返回一个编码值。这一切都发生在SSL上。

调用此方法不会导致状态更改。

最初这看起来应该是一个GET请求但是在进一步检查我很关心web服务器记录纯文本密码。

我们可以将其作为POST来实现,但这似乎是给出该操作的错误动词。

这仅仅是一个过程中的实用主义案例,还是我们可以做更多的事情来实现实用和RESTful案例?

回答

1

您应该使用Basic Authentication,您将用户名/密码作为标头传递。这也符合已经定义的标准。

已经有一个javascript代码用于执行base64编码 - 如果您需要在浏览器上执行此操作。


如果您正在进行身份验证并且编码值是访问令牌(cookie),则最好使用OAuth 2.0。

+0

感谢Aliostad。查看基本身份验证的详细信息,它不是我们所需要的(特别是缺点列表)。我们实际上并未在用户中签名,我们只是检查当前登录的用户是否知道他们自己的密码(更改某些设置时是密码障碍)。 – 2013-02-19 13:32:18

0

如果API调用发送的响应本身不是资源(不涉及从数据存储返回的资源),则应该使用非名词动词。

你可以有一个UserPasswordsController控制器暴露的操作方法是这样的:

[HttpPost()] 
public HttpResponseMessage Validate() 
{ 
    if (!this.Request.Content.IsFormUrlEncodedContent()) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.BadRequest, 
      "Body of request must be form URL encoded." 
     ); 
    } 

    var parameters = this.Request.Content.ReadAsFormDataAsync().Result; 

    var userName = parameters["userName"]; 
    var password = parameters["password"]; 

    // TODO: Validate user name and password 
    var isValid = true; 

    if(!isValid) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.Forbidden, 
      String.Format(null, "The password provided for {0} is not valid.", userName) 
     ); 
    } 

    return this.Request.CreateResponse(HttpStatusCode.OK); 
} 

并拥有注册路线是这样的:

routes.MapHttpRoute(
    name:   "UserPasswords", 
    routeTemplate: "api/v1/validate", 
    defaults:  new { controller = "userpasswords" } 
); 

你会POST表单数据的验证端点包含您希望验证的用户名和密码。状态为禁止状态表示密码无效,如果密码有效,则返回OK状态。

如果您是新开发REST接口并希望采取务实的方法,我强烈建议您查看Web API Design - Crafting Interfaces that Developers Love