WCF和身份验证

时间:2011-05-12 18:40:32

标签: wcf authentication

昨天我开始通过移植现有的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? */
    }
}

注意:我是最糟糕的敌人。请引导我走向概念上“干净”的解决方案,无论其复杂程度如何。

2 个答案:

答案 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服务是非常有限的,因为您强制在您的登录...登出呼叫序列之间发生服务中的所有方法。如果您为应用程序开发多个服务,那么尝试在自己的会话中协调与每个服务的交互可能非常容易出错。