相关疑难解决方法(0)

如何使用用户名/密码+ SSL使用WCF配置安全的RESTful服务

我正在寻找一个允许在WCF中使用RESTful服务的配置文件,但我仍然希望能够"利用"成员资格提供程序进行用户名/密码身份验证.

以下是使用basicHttp绑定或wsHttp w/out WS Security的当前配置的一部分,这将如何改变基于REST的服务?

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
Run Code Online (Sandbox Code Playgroud)

security rest wcf web-services

24
推荐指数
1
解决办法
2万
查看次数

ASP.NET网站+ Windows窗体应用程序+ WCF服务:客户端凭据

假设我正在考虑设计一个WCF服务,其主要目的是提供可供三个不同应用程序使用的广泛服务:面向公众的Web站点,内部Windows窗体应用程序和无线移动设备.该服务的目的有两个:(1)在中央位置合并与业务流程相关的代码,以及(2)锁定对遗留数据库的访问,最终一劳永逸地将其隐藏在一套服务之后.

目前,三个应用程序中的每一个都有自己的持久性和域层,同一数据库的视图略有不同.而不是所有三个应用程序都与数据库通信,它们将与WCF服务进行通信,从而启用某些客户端的新功能(移动选择器当前无法触发进程发送电子邮件),并集中通知系统(而不是对于新订单,计划任务每​​五分钟轮询一次数据库,只需在AcceptNewOrder()其中一个客户端调用服务方法时ping开销分页系统).总而言之,到目前为止听起来非常清醒.

然而,就整体设计而言,在安全方面我很难过.Windows窗体应用程序目前只使用Windows主体; 员工存储在Active Directory中,在应用程序启动时,他们可以以当前Windows用户身份登录(在这种情况下不需要密码),也可以提供他们的域名和密码.移动客户端没有任何用户概念; 它与数据库的连接是一个硬编码字符串.该网站有数千个用户存储在旧数据库中.那么如何实现身份模型并配置WCF端点来处理这个问题呢?

就Windows窗体应用程序而言,这不是一个大问题:WCF代理可以启动一次并且可以在内存中闲逛,所以我只需要一次客户端凭据(如果代理有问题,可以再次提示它们).移动客户端可以是特殊的,并使用X509证书对WCF服务进行身份验证.但是我该如何处理这个网站呢?

在网站的情况下,允许匿名访问某些服务.对于需要在假设的"客户"角色中进行身份验证的服务,我显然不希望在每个请求上对它们进行身份验证,原因有两个:

  • 我每次都需要他们的用户名和密码.几乎可以在任何地方存储这对信息 - 会话,加密的cookie,月亮 - 似乎是一个坏主意.
  • 我必须为每个请求点击数据库中的users表.哎哟.

我能想到的唯一解决方案是将Web站点视为可信子系统.WCF服务需要来自Web站点的特定X509证书.该网站在内部使用表单身份验证(调用AuthenticateCustomer()返回布尔结果的服务上的方法),可以向凭据列表添加其他声明,例如"joe@example.com以客户身份登录".然后以某种方式可以在具有该声明的服务上构建自定义IIdentity对象和IPrincipal,WCF服务确信该网站已经正确地验证了该客户(它将知道该声明尚未被篡改,至少,因为它会提前知道网站的证书.

所有这一切到位,WCF服务代码将能够说这样的话[PrincipalPermission.Demand(Role=MyRoles.Customer)]还是[PrincipalPermission.Demand(Role=MyRoles.Manager)]Thread.CurrentPrincipal将具有表示的用户(电子邮件地址为雇员客户或专有名称的东西,他们都非常有用用于记录和审计).

换句话说,每个服务都会存在两个不同的端点:一个接受着名的客户端X509证书(用于移动设备和网站),另一个接受Windows用户(用于员工).

对不起,这么久.所以问题是:这有什么意义吗?提议的解决方案是否有意义?我是不是太复杂了?

architecture asp.net authentication wcf

18
推荐指数
1
解决办法
1万
查看次数