我有一个 Web 应用程序 (C# - ASP.net),需要使用 HTTP 基本身份验证将用户传递到远程 Apache 服务器上的页面。我需要能够将用户名和密码传递到此服务器,以允许通过我的应用程序验证的用户无缝地使用其他应用程序,而不会被提示输入他没有的凭据。交接应该是安全的,因为只要用户名和密码不在客户端脚本中,两个系统都需要 SSL。有没有办法做到这一点?
最佳答案
基本身份验证详细信息编码在来自客户端的名为“授权”的请求 header 中。 header包含“username:password”的base64编码结果。
例如Aladdin:open sesame = 授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Basic Access Auth wikipedia page 上有更多详细信息.
对于基本身份验证,授权 header 需要添加到每个 请求。通常,在用户将其凭据输入浏览器显示的对话框后,浏览器会处理此问题。如果您想避免让您的用户输入这些凭据,那么您的 ASP.net 服务器将需要位于用户和 Apache 服务器(充当反向代理)之间,将 auth header 添加到它代表您的用户。
简单地访问您的服务器一次并为它添加一个“ token ”到请求然后重定向到 apache 服务器是不可能的。如果您使用表单/cookie 进行身份验证并且您的服务器将自己呈现给同一域中的用户(例如 asp.domain.com 和 apache.domain.com),则可以使用这种方法,然后可以将 auth cookie 设置在父域(例如 domain.com)和共享 - 参见 Forms Authentication across sub-domains .
假设 Apache 服务器上的基本身份验证方案不是您可以轻易更改的东西,它看起来像 reverse proxy是最好的选择。在反向代理代码中,HttpWebRequest 是创建对 apache 服务器的每个请求并向其添加额外的身份验证 header 的方法。
.net 将处理代理请求中的凭据编码,使用如下内容:
RemoteServer remoteServer = new RemoteServer(httpContext);
HttpWebRequest request = remoteServer.GetRequest();
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(UserName, SecurelyStoredPassword);
关于c# - 如何将用户重定向到不同的服务器并包含 HTTP 基本身份验证凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6374622/