我有两个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
。
实际上我理解发生了什么,似乎我的实施并非如此。你还有其他建议吗?
答案 0 :(得分:2)
您的意思是说您有两个网站(例如,www.client.com
和www.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将始终发送运行应用程序的用户的凭据,通常是网络服务帐户。