【问题标题】:Is it possible to secure a ColdFusion 11 REST Service with HTTP BASIC Authentication?是否可以使用 HTTP BASIC 身份验证保护 ColdFusion 11 REST 服务?
【发布时间】:2017-06-05 16:48:29
【问题描述】:

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

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

这是 REST 服务的设置:

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

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

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

但是,当我尝试请求 REST 路径 (http://site1/rest/inventory/) 时,我完全没有受到挑战。

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

【问题讨论】:

  • 确实没有答案,但我认为问题在于 IIS 安全性设置在文件夹 C:\web\site1\remoteapi\ 但 REST 路径实际上是 //site1/rest/inventory/ 中并不存在IIS 领域。所以身份验证挑战没有发生。我不认为你可以在 IIS 中创建一个虚拟目录来解决这个问题,因为这会在 ColdFusion 之前捕获请求。您可以将 IIS 安全性移至 Web 根目录并尝试一下吗?否则,我唯一的另一个想法是使用 ColdFusion 处理挑战(让它发送 401),但我更希望 Web 服务器来完成。
  • @Miguel-F 是的,这也是我的假设。我希望 Web 服务器也对用户进行身份验证。我正在研究一种在 CF 中处理身份验证的方法...

标签: rest authentication iis coldfusion


【解决方案1】:

因此,由于需要立即完成这项工作,我继续使用 Ben Nadel 网站中的一些原则,将自己的身份验证写入 REST 服务的 Application.cfc 的 onRequestStart() 方法。这是基本代码,尽管它使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多