1

我知道这是一个超级新手问题,但我很难理解这一点。我正在我的 n 层应用程序中实现 WebSecurity。我已将所有 WebSecurity 代码放在我的存储库层(最接近 db 层)中。

我有这样的代码:

public bool LogIn(string userName, string password, bool rememberMe)
    {
        return WebSecurity.Login(userName, password, rememberMe);
    }

public void LogOut()
    {
        WebSecurity.Logout();
    }

WebSecurity 不需要知道登录的上下文 - 我传递参数。但是退出呢?有 10 个用户退出,这里的代码如何知道要退出哪个用户?用户的上下文是否会以某种方式通过我的服务层从浏览器客户端到我的 API 控制器一直推送到存储库层?

4

2 回答 2

3

我会创建服务类来实现这个功能。这个服务层方法应该有IPrincipal注入IUserRepositoryIPrincipal接口存储有关当前用户的信息。HttpContext.Current.User实现它。

public interface IAuthenticationService
{
    bool SignIn(string userName, string password, bool rememberMe);
    void SignOut();
}

public class WebSecurityAuthenticationService : IAuthenticationService
{
     public WebSecurityAuthenticationService(IPrincipal user, IUserRepository userRepository)
     {
     }

     ....implementation...
}

您应该使用 IOC 容器来定义IPrincial与基于数据库的实现HttpContext.Current.User之间的绑定。IUserRepository我推荐 Ninject,但选择权在你。

于 2013-04-17T21:55:35.543 回答
2

您的存储库层不应该知道哪个用户登录了。您的存储库层甚至不应该知道有一个用户。您的所有身份验证都应由您的 Web 应用程序处理 - 然后您的 Web 应用程序在对用户进行身份验证后访问您的存储库层,该存储库层只是执行它被告知要做的任何事情,并且不关心身份验证。

更新:正如 John Saunders 所指出的,这不会将您的 Web 应用程序绑定到成员数据库/表,而是绑定到您正在使用的成员系统。如果这对您来说过于紧密耦合,您可以考虑定义一个IMembershipService接口,将其传递给控制器​​的构造函数(可能通过依赖注入)。然后,您将创建IMembershipService该 implementsLoginLogoutvia的具体实现WebSecurity

这样,如果您决定要以完全不同的方式实现会员资格,您唯一的限制是您的替代会员服务必须实现IMembershipService- 您可以完全更改技术和数据结构,而您的 Web 应用程序也不会更明智。

于 2013-04-17T21:43:43.420 回答