我在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身份验证?
答案 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;
}