是否可以使用HTTP BASIC身份验证来保护ColdFusion 11 REST服务?

时间:2017-06-05 16:48:30

标签: rest authentication iis coldfusion

我在ColdFusion 11中设置一个简单的REST服务.Web服务器是Windows Server 2012R2上的IIS 8.5。

需要保护此REST服务以防止未经授权的用户访问/写入数据。目前,只有一个授权用户,所以我希望尽可能简化身份验证/授权。我最初的想法是使用HTTP BASIC身份验证。

以下是REST服务的设置:

源目录:C:\ web \ site1 \ remoteapi \ REST路径:库存

为了实现这一点,我在IIS中配置了REST服务的源目录,仅授权一个用户,禁用匿名身份验证,并启用基本身份验证。

当我直接在浏览器中调用源目录时(即http://site1/remoteapi/inventory.cfc?method=read),我会看到基本身份验证对话框。

但是,当我尝试请求REST路径(http://site1/rest/inventory/)时,我根本没有受到质疑。

如何在REST路径上实现HTTP BASIC身份验证?

1 个答案:

答案 0 :(得分:0)

因此,由于需要在没有太多延迟的情况下完成此操作,我继续使用Ben Nadel网站的一些原则,我将自己的身份验证写入REST服务的onRequestStart()方法&#39 ; s Application.cfc。这是基本代码,虽然它使用VARIABLES范围中的硬编码值来验证用户名和密码,但也不包括任何实际的授权"设定:

public boolean function onRequestStart(required string targetPage) {
    LOCAL.Response = SUPER.onRequestStart(ARGUMENTS.targetpage);

    if  (!StructKeyExists(GetHTTPRequestData().Headers, "Authorization")) {
        cfheader(
            name="WWW-Authenticate",
            value="Basic realm=""REST API Access"""
            );

        LOCAL.RESTResponse = {
            status = 401,
            content = {Message = "Unauthorized"}
            };

        restSetResponse(LOCAL.RESTResponse);
    }
    else {
        LOCAL.IsAuthenticated = true;

        LOCAL.EncodedCredentials =
            GetToken( GetHTTPRequestData().Headers.Authorization, 2, " " );

        //  Credential string is not Base64
        if  (   !ArrayLen(
                    REMatch(
                        "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$",
                        LOCAL.EncodedCredentials
                        )
                    )
            ) {
            LOCAL.IsAuthenticated = false;
        }
        else {
            //  Convert Base64 to String
            LOCAL.Credentials =
                ToString(ToBinary( LOCAL.EncodedCredentials ));

            LOCAL.Username = GetToken( LOCAL.Credentials, 1, ":" );
            LOCAL.Password = GetToken( LOCAL.Credentials, 2, ":" );

            if  (   LOCAL.Username != VARIABLES.CREDENTIALS.Username
                ||  LOCAL.Password != VARIABLES.CREDENTIALS.Password
                ) {
                LOCAL.IsAuthenticated = false;
            }
        }

        if  (!LOCAL.IsAuthenticated) {
            LOCAL.Response = {
                status = 403,
                content = {Message = "Forbidden"}
                };

            restSetResponse(LOCAL.Response);
        }
    }

    return LOCAL.Response;
}