2011-03-08 60 views
6

我正在重建一个网站,我试图使用SOA方法。目前的网站是在.NET 2.0中,并使用开箱即用的SqlMembershipProvider。使用C#的SOA方法验证

我们试图消除与数据库的直接连接,并通过WCF服务层推送所有内容。我们使用的方法是让所有东西都分开 - 有一个模型和接口库,一个服务库,然后是一个服务代理库。

到目前为止最大的障碍是搞清楚如何管理用户身份验证及其会话。用这种方法做这件事的最好方法是什么?

我们是否应该废弃.NET会员模式并使用类似OpenId的方法,并且只允许用户将其数据重新连接到新帐户?

我已经做了一些搜索,找不到很多关于如何管理这个,虽然我知道它已经完成。

回答

1

这是我最终做的,以防万一有兴趣。我开始使用WCF身份验证服务,但后来意识到它没有给我我想要的一切。我可以登录和注销,但仍然需要创建自己的注册方法并获取MembershipUser。

因此,我去了我的ServiceContracts库,并创建了一个名为IMembership的接口。起初,我将它创建为一个类并从MembershipProvider继承,这样我就可以获取为我生成的所有方法存根。一旦它们被生成,我修改了存根,并将它变成了一个界面。

然后,我走进我的服务资料库,创造了这很简单,因为对于实现我只是用Membership.Provider接口的实现....

然后在我的服务供应商客户机库,我没有IMembership接口的通常实现,它也从ClientBase <>继承。在它旁边,我创建了一个WCFMembershipProvider,它实现了MembershipProvider,并从刚刚创建的MembershipClient调用了方法。

在我主持WCF服务的WebApp中,我在web.config中设置了我的SQL成员资格提供程序,然后为服务创建了我的svc文件和端点。

在使用Web应用程序时,我只是将服务客户端引用添加到svc,然后为我的WCFMembershipProvider设置了成员资格提供程序。

和中提琴 - 我在做生意。

很多重复的代码,但它很好。

+0

我可能会多抽象一点,但它适用于我现在需要的东西。 – Doug 2011-03-24 19:51:16

0

尝试创建WCF服务并维护会话状态的等价物时,您将遇到的主要问题是没有Cookie(因为没有浏览器来维护它们),所以.NET成员资格提供程序不是默认情况下非常有用。我知道我是如何处理等效问题的,是让生成的令牌(例如Guid)与我需要维护的状态信息相对应。

然而,你的问题更多的是关于认证。我不知道你可以通过WCF做一个OpenId实现工作(尽管我明白它对于普通的ASPX很好)。您只能使用简单的用户名/密码认证方案(可能需要手动使用MembershipProvider,如果您需要它来处理数据库中的密码加密),并且您可以使用(很可能)传输方式通过服务传递用户名和密码安全(SSL)。

我希望这有些帮助。也许有人提出了一个更标准的会话状态替换为WCF,但我不知道它是否如此。

0

很难提供一个具体的答案,而不知道一点点关于你想要的设置。

您是否打算将您的WCF服务公开为独立于您的网站的公共访问?您的网页是否可以通过AJAX直接访问您的WCF服务?

最简单的情况可能是一个严格的分层部署UI只与网站会谈,只与WCF服务进行网站会谈。

http://msdn.microsoft.com/en-us/library/ms731049.aspx对使用​​ASP.NET成员资格模型和WCF进行了很好的阅读。

我构建了一个使用AJAX与WCF服务层交谈的站点。我们使用WCF的表单身份验证提供程序。它工作得很好,除了没有一种优雅的方式来处理通过Web服务的登录。在我们的情况下,这很好,因为我们希望用户通过输入凭据进入网站并登录。

如果您已经投资收集用户的凭证以与SQLMembership提供者一起工作,那么可以通过基于ADFS +声明的模型来表示它。这将适用于上述所有情况。虽然有点学习

+0

那么,基本上我想实现的是用WCF成员提供程序替换Sql成员提供程序。我试图从我的DMZ中删除与内部SQL服务器的所有直接连接,并只使用服务。我查看了WCF提供的认证服务,但似乎没有一种简单的方法可以将它实现到我自己的客户端代理库中,而无需部署服务并使用命令行工具创建我的代理想避免。我会最终建立我的auth身份验证服务,并创建一个定制的Provider来与之交互。 – Doug 2011-03-17 20:40:11

+0

根据您的回答提出的问题。如果只有您的网站(并且没有其他人)需要与您的WCF服务交谈,那么您为什么要在每次Web服务调用中使用用户的凭证来进行身份验证?这实质上(例如)意味着您必须将用户的密码保存在会话变量中并将其传递给每个服务调用。 – Naraen 2011-03-24 00:12:20