ASP.NET成员资格跨不同层发送用户名

时间:2011-05-13 19:13:45

标签: asp.net n-tier-architecture custom-membershipprovider

我有3层(UI,BLL,DAL),那些BLL和DAL驻留在外部WS上,显然我的会员用户在UI层工作。

所以...我试图在我的Bussines表中存储不同任务的用户名(如CRUD)

  • 插入注册表(用户名:nicolas)
  • 删除注册表(用户名:peter) 等...

最简单的方法是在所有方法上发送用户名并存储在不同的表中。但是如果你有很多商务表,那么这个想法就不具备可扩展性和非常脏的特点。

知道另一种方法吗?我读到了编写自定义成员资格提供程序以将不同用户存储在缓存中并从中检索。但我不知道这是否是最好的解决方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

除非您在BLL和DLL中使用服务,否则除了通过UI之外,无法访问这些服务。

答案 1 :(得分:1)

ASP.NET的自定义控件依赖于System.Web中的Membership库(更具体地说,System.Web.Security)。只要您使用这些控件(例如,<asp:Login>控件),您就已经依赖于System.Web。在这种情况下,应用程序的任何层都可以执行类似这样的操作来检索当前用户:

using System.Web.Security;
...
MembershipUser user = Membership.GetUser();

然后使用user.UserName检索用户的用户名。


更新以反映对图层托管在不同服务器上的理解。

我会将一个StartSession()方法添加到BLL中,该方法将用户名作为参数,并返回一个字符串会话ID。服务器上的BLL生成会话ID(可能使用Guid)并使用BLL端缓存来保存用户名。然后在客户端,设置包含会话ID的cookie。它将与Web请求一起提交。 (根据您提交Web请求的方式,您可能必须使用javascript设置cookie值。)

这样您就不必修改方法的签名,但仍然可以通过使用缓存来获取BLL中的用户名。您必须确保您的登录页面调用GetSession()方法,并在提交更多请求之前设置会话cookie。