WCF 4.0 REST用户名密码验证

时间:2011-09-18 23:15:56

标签: wcf wcf-security restful-authentication wcf-rest

我一直在使用ASP.Net成员资格/角色提供程序在WCF 4.0 RESTfull服务中使用用户名/密码身份验证/授权。

花了两天时间试图找到大多数人都同意的东西,我放弃了。很多混乱似乎是因为专门针对WCF 4.0的信息很少。

有人可以

    <击>
  1. 就WCF 4.0 + REST是否一个好主意开始提供权威观点?
  2. 概述普遍接受的步骤(或链接)。
  3. 提供完成此操作所需的相当完整的代码示例。
  4. 编辑: 对于能够使用VS 2010中的WCF服务应用程序模板的RESTfull WCF 4.0服务的用户名/密码身份验证和授权提供完整示例(甚至只是完整示例的链接)的任何人的赏金。

4 个答案:

答案 0 :(得分:10)

我认为您问题的答案取决于您的服务目的以及将要使用它的应用程序类型。

如果您有一个现有的ASP .Net应用程序,并且您希望将其部分功能公开为RESTfull服务,您可以使用AJAX来使用客户端,那么WCF可能不是最佳选择。在这种特殊情况下,您已经在Web应用程序中拥有了一个身份验证用户,并且您希望在AJAX调用期间传播该身份验证。实现这一点实际上非常简单。

ASP .Net Forms身份验证基于身份验证Cookie,该身份验证Cookie在成功登录后生成并传递给浏览器。从浏览器调用到与您的应用程序相同的域中的任何URL也将包含身份验证cookie。在ASP .Net MVC中,您可以简单地将您的服务方法实现为需要授权的Controller操作,一切都将在幕后发生。

在经典ASP .Net中,您可以使用PageMethods来实现您的服务方法,并且将再次为您发送和验证cookie(PageMethods herehere的示例)。

另一方面,如果您的服务将在浏览器之外使用(例如从桌面或移动应用程序),那么WCF可能确实是实现该服务的正确工具。但是,ASP .Net表单身份验证不是实现安全性的最佳选择。 REST服务的主要目的是简化,以便客户可以在每个平台上轻松实现,而基于cookie的ASP .Net表单身份验证机制并不是最直接的。

OAuth是一种协议,专门用于在Web服务环境中进行用户身份验证。它的第二个版本仍在草稿中(找到规范here),但很可能这是你想要使用的版本,因为它比OAuth 1.0简单得多。 Facebook已经在OAuth 2.0上实现了API身份验证(详情here),您可能希望检查其实现是否有灵感。

除了用户身份验证之外,OAuth还确保使用应用程序(服务客户端)身份验证,并确保用户永远不会直接在客户端应用程序中输入其凭据。如果这实际上需要的太多,您可以创建一个受OAuth 2.0启发的自定义实现。

首先,您需要通过HTTPS公开您的服务,以便加密服务和客户端之间的所有通信。其次,您需要在服务中创建一个登录方法,如下所示:

string Login(string user, string password);

成功登录后,上述方法将返回一个身份验证令牌。然后将在所有其他方法上使用和验证身份验证令牌。例如:

Employee[] GetAllEmployees(string authToken)
{
  // verify token here

  // return data if user authenticated by token
}

在上面的体系结构中,authToken与ASP .Net表单身份验证中的身份验证cookie具有相同的作用,但它作为简单参数传递。您将负责实现生成令牌的算法(它们必须足够长且独特,使用here等算法)并存储和验证它们。

答案 1 :(得分:2)

WCF Web Api使编写WCF Rest服务变得非常容易,但它有其局限性。要进行身份验证,您需要使用WCF Rest Contrib

如果您想要对服务设计进行最大程度的控制,那么您应该回归ASP.NET MVC并为每种服务方法编写控制器方法。

答案 2 :(得分:1)

一种方法是使用安全密钥。和令牌

  1. 每位客户都有第一次请求时发送的安全密钥, 可能在标题中。
  2. 您可以生成密钥,例如key = MD5Hash(用户名+密码);
  3. 作为回应,他获得令牌,然后在每个令牌中发送令牌 请求。令牌可以是Guid。每个令牌在 x 分钟后过期。
  4. 在服务器端,您可以维护像Dictionay这样的单例字典,以便在当前时间&gt;检查令牌到期时间。到期时间将其从字典中删除。
  5. 要续订会话,请在代码中添加续会方法。
  6. 对于extream安全性

    拥有私钥/公钥对,客户端将使用公钥加密整个帖子数据,您将使用私钥解密。

答案 3 :(得分:-1)

以下是使用asp.net mvc

完成的示例

当我致电http://localhost:57322/Test/SecureMethod/时,我收到了错误消息。但是,如果我先调用http://localhost:57322/Test/Login?username=test&password=abc,则原始网址会返回有效结果。

namespace MvcApplication1.Controllers
{
    public class TestController : Controller
    {
        public ActionResult Login(string username, string password)
        {
            if (username=="test" && password == "abc")
            {
                FormsAuthentication.SetAuthCookie(username, true);
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            return Json(false, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        public ActionResult SecureMethod()
        {
            return Json("Hello world",JsonRequestBehavior.AllowGet);
        }

    }
}

如果您已经编写了.svc而且它们不是通过MVC完成的,您可以将它们放在通过web.config保护的任何文件夹中,然后在进行任何安全调用之前使用上面的Login方法登录。