我知道这是一个超级新手问题,但我很难理解。 我在我的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控制器一直被推送到存储库层?

===============>>#1 票数:3

我将创建服务类来实现此功能。 该服务层方法应注入IPrincipalIUserRepository IPrincipal接口存储有关当前用户的信息。 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容器来定义IPrincialHttpContext.Current.User之间以及IUserRepository及其基于数据库的实现之间的IUserRepository 我推荐Ninject,但选择权由您决定。

===============>>#2 票数:2 已采纳

您的存储库层不应该知道哪些用户登录,您的存储库层甚至不应该知道, 一个用户。 您的所有身份验证都应由您的Web应用程序处理-您的Web应用程序在对用户进行身份验证之后,访问您的存储库层,该存储库层仅执行被告知要执行的操作,而与身份验证无关。

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

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

  ask by SB2055 translate from so

未解决问题?本站智能推荐: