昨天我开始通过移植现有的ASP.NET Web服务来学习WCF。
创建WCF服务本身非常简单。在我创建第一个WCF服务库项目大约一个小时之后,我已经在WCF测试客户端中成功测试了我的新WCF服务。
现在我想实现一个简单的身份验证系统,但仍然不知道如何。为简单起见,假设我的Web服务有三个操作:登录,获取用户名的长度和注销。如何在以下代码中完成TODO?
[ServiceContract]
public class MyService
{
[OperationContract(IsInitiating = true, IsTerminating = false)]
public bool Login(string userName, string password)
{
/* I have already implemented the function that validades
whether the user name and password are correct. */
if (ValidateLogin(userName, password))
{
/* TODO: Initiate a session */
return true;
}
else
return false;
}
[OperationContract(IsInitiating = false, IsTerminating = false)]
public int GetUserNameLength()
{
/*
TODO: How to validate whether the user has logged in?
How to obtain the name of the user that has logged in?
*/
int userNameLength = 42;
return userNameLength;
}
[OperationContract(IsInitiating = false, IsTerminating = true)]
public void Logout()
{
/* TODO: How to logout? */
}
}
注意:我是最糟糕的敌人。请引导我走向概念上“干净”的解决方案,无论其复杂程度如何。
答案 0 :(得分:2)
您使用的方法可能与WCF无关。根据您的上述方法,用户已经过身份验证,因为它可以调用登录操作。通常情况下,在他/她进行审核之前,不应允许用户调用任何操作,但在您的方法中并非如此。
此外,WCF中的会话是客户端启动的,而不是服务器启动的。但是,根据您的方法,它们似乎是服务器启动的。
这里有一些资源可以更好地了解WCF安全性, http://msdn.microsoft.com/en-us/library/ms731925.aspx 改进wcf安全指南 - http://wcfsecurityguide.codeplex.com/
如果你想使用Custom UserNamePassword验证器,这里是链接, http://msdn.microsoft.com/en-us/library/aa702565.aspx
HTH, 阿米特
答案 1 :(得分:1)
您似乎正在尝试在应用程序级别处理身份验证。如果您有特定的业务需要,请继续前进,但如果您只是想确保经过身份验证的用户正在调用您的服务,请使用build-in WCF authentication mechanisms.
此外,您显示的服务合同在ServiceContract中缺少此设置:
[ServiceContract(SessionMode=SessionMode.Required)]
使IsInitiating和IsTerminating真正起作用。创建基于会话的WCF服务是非常有限的,因为您强制在您的登录...登出呼叫序列之间发生服务中的所有方法。如果您为应用程序开发多个服务,那么尝试在自己的会话中协调与每个服务的交互可能非常容易出错。