【问题标题】:Custom Authentification via Service Method?通过服务方法自定义身份验证?
【发布时间】:2012-10-07 19:48:49
【问题描述】:

对于客户端-服务器应用程序,我想开发一个主要由应用程序本身使用的 Web 服务(目前不打算供第三方使用)。

然而,从长远来看,将 WebService 公开为某种 API 通常是可取的。因此,我已经在考虑选择一种允许“RESTifing”(可怕的词创建,我知道 ;-))在以后轻松实现 Web 服务的技术。
WCF 似乎就在这里,因为它提供了 webHttpBinding 以及其他允许利用 LAN 和 .NET 客户端的绑定。

我现在遇到的问题是关于身份验证:WCF 提供的所有身份验证措施似乎都发生在实际服务“之外”。但是,我想要一个Login 方法(或者更“RESTful”的方法,如here under point 2 所示)。

例如,我想像这样写一个服务:

[ServiceContract]
public interface IUserService
{
   [ServiceMember]
   [WebInvoke(Method = "POST", WebUri="/Session")]
   public void Login(string username, string password);

   [ServiceMember]
   [WebInvoke(Method = "POST", WebUri="/Users")]
   public void Register(RegisterUserParameter parameter);
}

如何将此服务集成到 WCF 中,以便这些方法更好地适用于我的服务项目中的多个子服务?

使用内置 WCF 身份验证时,我需要在进行任何服务调用之前提供用户名和密码。因此,调用 RegisterLogin 都会失败,因为我没有经过身份验证。

我如何告诉 WCF 记住当前使用我的服务方法登录的用户?是否有可能在客户端的 WCF 会话中存储诸如会话 cookie 之类的东西?

或者以我尝试的方式在 WCF 下实现身份验证通常是个坏主意?

我是否应该直接选择 WebAPI,代价是在我的客户端应用程序中以更复杂的方式与服务通信?

【问题讨论】:

    标签: c# .net wcf security authentication


    【解决方案1】:

    如果您依赖外部身份验证,我认为您可以轻松实现您的目标,例如 FormsAuthentication。

    这个想法是用 PrincipalPermission 属性保护所有方法,但只有一个例外 - Login 方法应该将表单 cookie 附加到响应中。

    可以在我的一篇博文中找到一些技术细节:

    http://netpl.blogspot.com/2010/04/aspnet-forms-authentication-sharing-for.html

    虽然我在那里提到 Silverlight 作为客户端,但该解决方案是通用的,适用于任何客户端技术。此外,博文中没有提到 Login 方法,但其唯一目的是将表单 cookie 附加到响应中。

    这样,您的客户的控制流程将首先调用您的 Login 方法,然后使用问题 cookie 调用所有其他方法。

    请注意,这仅适用于 Http 绑定,因此这不是任何可能的 Wcf 绑定的通用解决方案。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      1. 使用 WCF 登录密码身份验证创建登录服务。它将使用例如UserNamePasswordValidator 的子类,用于针对 DB 等验证用户名密码。如果验证成功,则返回一个令牌(例如 GUID)。

      2. 客户端将连同此令牌一起进行所有其他服务调用。令牌验证可以集中进行,无需修改每个服务。这样做:

        • 在您的请求标头中传递您的令牌
        • 实现 IDispatchMessageInspector,在其 AfterReceiveRequest 从标头中读取令牌并对其进行验证。如果验证成功,工作流将进入您的 WCF 服务,否则您将抛出 FaultException
        • 将您的 MessageInspector 附加到需要验证的服务:


          ...

      【讨论】:

        猜你喜欢
        • 2015-03-06
        • 2019-03-23
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 2015-02-24
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多