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

この機能を実装するサービス クラスを作成します。このサービス層メソッドには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の間のバインディングを定義する必要があります。IUserRepositoryNinject をお勧めしますが、選択はあなた次第です。

于 2013-04-17T21:55:35.543 に答える
2

リポジトリ層は、どのユーザーがログインしているかを認識すべきではありません。リポジトリ層、ユーザーが存在することさえ認識すべきではありません。すべての認証は、Web アプリケーションによって処理される必要があります。Web アプリケーションは、ユーザーを認証した後、リポジトリ レイヤーにアクセスします。リポジトリ レイヤーは、指示されたことを実行するだけで、認証には関与しません。

更新: John Saunders が指摘しているように、これは Web アプリケーションをメンバーシップ データベース/テーブルに結び付けるのではなく、使用しているメンバーシップ システムに結び付けます。これでも密結合しすぎている場合は、IMembershipServiceインターフェイスを定義して、コントローラーのコンストラクターに渡すことを検討できます (依存性注入を介して可能性があります)。IMembershipService次に、その実装の具体的な実装を作成し、LoginLogout介しWebSecurityます。

このように、完全に異なる方法でメンバーシップを実装することに決めた場合、唯一の制限は、代わりのメンバーシップ サービスを実装する必要があるというIMembershipServiceことです。テクノロジーとデータ構造を完全に変更することができ、Web アプリケーションは賢明ではありません。

于 2013-04-17T21:43:43.420 に答える