0

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

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

我现在遇到的问题是关于身份验证:WCF 提供的所有身份验证措施似乎都发生在实际服务的“外部”。但是,我想要一个Login方法(或者更“RESTful”的方法,如第 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?

4

2 回答 2

0

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

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

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

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

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

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

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

于 2012-10-07T20:11:56.013 回答
0

You can try the following:

  1. Create Login service with WCF login-password authentication. It will use e.g. subclass of UserNamePasswordValidator to validate username-password against DB etc. If validation is successful, return a token (e.g. GUID).

  2. All other service calls will be made by the client together with this token. Token verification can be made centrally, without modifying each service. To do so:

    • Pass your token in the header of your request
    • implement IDispatchMessageInspector, in its AfterReceiveRequest read token from header and validate it. If validation is successful, workflow will go inside your WCF service, if not you throw FaultException
    • attach your MessageInspector to services that need validation:


      ...

于 2012-10-16T11:41:24.830 回答