如何在不使用重定向的情况下从Web应用程序中了解是否对其他Web应用程序进行了身份验证?

时间:2011-06-14 10:56:07

标签: c# asp.net

我有两个asp.net Web应用程序AppClient和AppServer。如何从AppClient了解AppServer是否经过身份验证?

我不想重定向到服务器然后重定向到客户端。我希望我能在后台做到这一点。


到目前为止我尝试了什么

在服务器(AppServer)中:我在AppServer中创建了一个名为IsAuthenticated.aspx的页面,并使其在Response中写入,无论AppServer是否经过身份验证。

Response.Write(User.Identity.IsAuthenticated);

在客户端,我编写了以下代码:

string url = "http://appServer/isauthenticated.aspx";
System.Net.HttpWebResponse response;
System.Net.HttpWebRequest request;

request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html";
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
request.Credentials = CredentialCache.DefaultCredentials;
request.ServicePoint.ConnectionLimit = 25;
response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();

上面的代码效果很好,但没有达到预期的效果。即使AppServer已通过身份验证,响应也始终返回false

实际上我理解发生了什么,似乎我的实施并非如此。你还有其他建议吗?

2 个答案:

答案 0 :(得分:2)

您的意思是说您有两个网站(例如,www.client.comwww.server.com)并且您的用户已在www.server.com上进行了身份验证,并且您想要检查他是否在那里进行了身份验证www.client.com。我理解你了吗?

在这种情况下,您的代码显然不起作用(除非您使用Windows身份验证和模拟)。

请详细说明你想做什么。我看到两种情况,解决方案各有所不同。

1)您不想检查www.client.com网站上的用户名和密码,并且希望依赖www.server.com的帐户数据库。这类似于OpenID,Google SSO等。 在这种情况下,您需要在www.server.com上实现远程身份验证功能。这是一个草案:

[ServiceContract]
public interface IRemoteAuth
{
    [OperationContract]
    public bool CredentialsValid(string login, string hashedPassword)
    {
        return MyDatabaseHelper.IsPasswordValid(login, hashedPassword);
    }
}

通常,这些服务器方法实现为ASMX Web服务或WCF服务(第二个seems the preferred way)。

2)您希望www.client.com知道用户是否在线并在www.server.com上验证现在正确。在这种情况下,您需要跟踪www.server.com上的当前在线用户(ASP.NET不会自动提供此信息IMO)。那么你应该设计一个服务(同样,ASMX或WCF)来回答一个问题'用户名为XXX当前是否在线?'。

[ServiceContract]
public interface IOnlineUsersInfo
{
    [OperationContract]
    public bool IsUserOnline(string login)
    {
        return MyOnlineUserList.Instance.Any(user => user.Login == login);
    }
}

答案 1 :(得分:0)

AppClient设置是否使用模拟?如果不是,AppClient将始终发送运行应用程序的用户的凭据,通常是网络服务帐户。