RESTful验证密码服务

时间:2013-02-19 10:49:25

标签: asp.net asp.net-web-api restful-architecture

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

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

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

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

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

这只是一个实用主义而不是程序的情况还是我们可以做更多的事情来实现实用和RESTful案例?

2 个答案:

答案 0 :(得分:1)

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

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


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

答案 1 :(得分: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" }
);

您可以将表单数据发布到包含您要验证的用户名和密码的验证端点。状态为Forbidden状态表示密码无效,如果密码有效,则返回OK状态。

如果您不熟悉REST界面并希望采取务实的方法,我强烈建议您查看Web API Design - Crafting Interfaces that Developers Love