2011-05-12 201 views
2

昨天我通过移植现有的ASP.NET Web服务开始学习WCF。WCF和身份验证

创建WCF服务本身非常简单。在创建我的第一个WCF服务库项目后大约一个小时,我已经成功地在WCF Test Client中测试了我的新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? */ 
    } 
} 

注:我的头号敌人总值黑客之一。请引导我走向概念上的“清洁”解决方案,无论其复杂程度如何。

回答

2

您使用的方法可能与WCF不正确。基于上述方法,用户已经通过身份验证,因为它可以调用登录操作。通常情况下,用户不应被允许在他/她进行认证之前调用任何操作,但在您的方法中,情况并非如此。

此外,WCF中的会话是客户端启动的,而不是服务器启动的。但是,根据您的方法,它们似乎是服务器启动的。

我这里还有一些资源,这揭示了WCF安全更多的光线, http://msdn.microsoft.com/en-us/library/ms731925.aspx 提高WCF安全指南 - http://wcfsecurityguide.codeplex.com/

如果你想使用自定义UserNamePassword验证,这里是链接, http://msdn.microsoft.com/en-us/library/aa702565.aspx

HTH, Amit

1

看起来您正试图在应用程序级别处理身份验证。如果你有一个特定的业务需求来这样做,那么请便,但如果你只是想确保通过身份验证的用户呼叫服务,然后使用build-in WCF authentication mechanisms.

而且,你是显示的服务合同是缺少在此设置ServiceContract:

[ServiceContract(SessionMode=SessionMode.Required)] 

使IsInitiating和IsTerminating实际工作。创建基于会话的WCF服务非常有限,因为您正在强制服务中的所有方法发生在登录...呼叫的注销序列之间。如果您为应用程序开发多个服务,那么尝试在其自己的会话中协调与每个服务的交互可能非常容易出错。

+0

@Sixto Saez:我一直在努力不去处理应用程序级别的身份验证。我编写了自己的'UserNamePasswordValidator'派生类,并相应地修改了我的'App.config'文件。它仍然没有工作。我会_love_能够分别处理认证和实际操作。 – pyon 2011-05-12 21:59:13

+0

使用WCF配置自定义验证可能会很棘手。您需要提供更多关于您计划用于服务的绑定或绑定的详细信息。您选择的绑定将决定您将如何实现自定义验证。这篇[文章解释了如何配置](http://msdn.microsoft.com/zh-cn/library/ms731049.aspx)内置的ASP.NET成员资格提供程序与WCF一起使用。我将从文章中的示例代码开始,至少可以设置一个可用的WCF服务。接下来,使用该示例服务来编写您正在编写的服务。 – 2011-05-12 22:39:31

+0

@Sixto Saez:我对实现全面的'MembershipProvider'不感兴趣。我只想实现一个'UserNamePasswordValidator'。根据文件,它应该工作。 – pyon 2011-05-12 23:20:36