ASP.NET成员身份跨不同层发送用户名

ASP.NET成员身份跨不同层发送用户名,asp.net,n-tier-architecture,custom-membershipprovider,Asp.net,N Tier Architecture,Custom Membershipprovider,我有3层(UI、BLL、DAL),这些BLL和DAL驻留在外部WS上,显然我的成员用户在UI层上工作 所以。。。我试图在我的业务表中存储不同任务(如CRUD)的用户名 插入注册表(用户名:nicolas) 删除注册表(用户名:peter) 等等 最简单的方法是在所有方法上发送用户名并存储在不同的表中。但是,如果你有很多业务表,这个想法是不可扩展的,而且非常肮脏 有没有别的办法?我读过关于编写自定义成员资格提供程序来将不同的用户存储在缓存中并从中检索的内容。但我不知道这是否是最好的解决办法 有

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

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

  • 插入注册表(用户名:nicolas)
  • 删除注册表(用户名:peter) 等等
最简单的方法是在所有方法上发送用户名并存储在不同的表中。但是,如果你有很多业务表,这个想法是不可扩展的,而且非常肮脏

有没有别的办法?我读过关于编写自定义成员资格提供程序来将不同的用户存储在缓存中并从中检索的内容。但我不知道这是否是最好的解决办法


有什么想法吗?

除非您在BLL和DLL中使用服务,那么重点是,除了通过UI之外,无法访问这些服务。

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

using System.Web.Security;
...
MembershipUser user = Membership.GetUser();
然后使用
user.UserName
检索用户的用户名


更新以反映对层托管在单独服务器上的理解

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


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

用户始终可以通过HttpContext@Capar,说得好。我个人不喜欢这样,因为我希望我的BLL/DLL不依赖于特定的前端。如果你想在现有功能的基础上扩展一个API,这会带来问题。为什么你说你的MembershipUser在UI层工作?我认为成员资格库是BLL的一部分,而成员资格提供者的特定实现,例如SqlMembershipProvider,是DAL的一部分。很抱歉,我对我的层的解释是错误的。我有3层是的,但稍微有点不同的是BLL和DAL,这2层是WS。所以,HttpContext只适用于UI。@Charlie Kilian,我没有BLL和DAL作为成员。仅使用asp.net的自定义控件。你建议我用这种方法来解决我的问题吗?是的,这是真的,我是在编辑我原来的帖子。我正在使用BLL和DLL中的服务。是的,我知道。当然,它在同一上下文中的不同层上都能完美地工作。但是我的DAL和BLL在不同的服务器上。是否有机会在层之间共享我的httpcontext或用户?我会将用户名作为对BLL/DAL的每次调用的参数。或者这就是您试图避免的吗?如果您试图避免这种情况,那么您可以向您的BLL添加一个StartSession()方法,供UI调用。它将采用用户名参数,并返回会话ID。然后将会话ID设置为cookie。当您调用web服务时,cookie将随调用一起发送,从而允许服务器查找会话。我假设您正在使用web服务,并且您的前端是基于web的。是吗?是的,我正在努力避免这种情况。是的,对吗。我的架构是WebUI(服务器1)+WS(服务器2)(BLL和DAL)