基本身份验证要求对话框

5
首先,我并不精通编码。
我对如何在特定目录或网站上触发/或抛出基本/标准“需要验证”对话框的脚本很感兴趣,并且用户输入的凭据将被检查是否与另一个位于另一个网站上的数据库匹配。
例如,像那些从其网站获取您的凭据并针对Hotmail数据库或服务器进行检查,告诉您凭据是否不正确(请重试),如果正确则将其重定向到由管理员实现的特定网站的“检查谁在MSN上阻止了你”的网站。 (在这种情况下是Hotmail联系人列表)
同时,当它检查到凭据正确时,如何使脚本将这些凭据存储到特定的.txt文件或文件夹中?
唯一的区别是我想要的只是基本身份验证对话框,就像此示例一样,但我希望这个功能能够实现在我的网站上。
我希望我的表述清楚明了。
非常感谢您提前的帮助。

1
你的表述很清晰易懂。但是实现这个功能的简单方法是通过你的Web服务器配置,而不是一个编程问题,在我看来。 - Stephen C
你是在指HTTP身份验证吗?你使用的服务器是什么?Apache? - Meitham
2个回答

3

您需要向浏览器发送401响应代码,以使浏览器提示输入用户名和密码。以下是来自PHP手册的PHP示例:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

你应该可以在你选择的语言中做同样的事情,不过你需要研究一下在你所使用的语言中用户名和密码变量存储在哪里。
作为替代方案,你也可以在你的Web服务器中进行配置。这样,Web服务器处理身份验证,你只需要编写应用程序来获取当前用户名,通常可以在"REMOTE_USER"环境变量中找到。在Apache中,你可以按以下方式限制对特定文件夹的访问:
<Directory /usr/local/apache/htdocs/secret>
    AuthType Basic
    AuthName "Restricted Files"
    # (Following line optional)
    AuthBasicProvider file
    AuthUserFile /usr/local/apache/passwd/passwords
    Require user rbowen
</Directory>

请查看Apache关于身份验证和访问控制的文档获取更多信息。即使您使用不同的Web服务器,也可以放心,这是Web服务器中常见的功能。我相信您能够在您所使用的任何Web服务器中找到相应的功能。

太好了,但是在我发送401和填写凭据之后,如何检查它们是否与不同网站或服务器中的数据库匹配?并且在它检查它们正确(我错过了这一点)之后,如何将它们存储在特定的文件中,比如.txt文件或文件夹中?! - Heath

1
Java导入已被排除...
显示用户名/密码对话框...
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"My Realm\"");
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "");

解码请求...

private boolean authenticateRequestOk(HttpServletRequest request)
{
    String authorizationHeader = request.getHeader("Authorization");

    if (authorizationHeader != null)
    {
        byte[] decodedUsernamePassword;
        try
        {
            decodedUsernamePassword = Base64.decode(authorizationHeader.substring("Basic ".length()));
        }
        catch (IOException e)
        {
            log.error("Error decoding authorization header \"" + authorizationHeader + "\"", e);
            return false;
        }

        String usernameAndPassword = new String(decodedUsernamePassword);

        String username = StringUtils.substringBefore(usernameAndPassword, ":");
        String password = StringUtils.substringAfter(usernameAndPassword, ":");

        if (USERNAME.equalsIgnoreCase(username) && PASSWORD.equalsIgnoreCase(password))
        {
            return true;
        }
    }

    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接