2011-07-11 19 views
5

私は、Scott MilletによるProfessional ASP.NET Design Patternsのケーススタディに従っています。このケーススタディでは、認証はインフラストラクチャプロジェクトで処理されます。これには、AspFormsAuthentication:IFormsAuthentication、AspMembershipAuthentication:ILocalAuthenticationServiceなどの実装が含まれています。DDD認証サービス

これは正常に動作しますが、これは組み込みのメンバーシッププロバイダを使用しているためですが、私はそうではないので、私のリポジトリにアクセスする必要があります。私のシナリオでは、ILocalAuthenticationServiceとAspMembershipAuthenticationの実装をServicesプロジェクトに配置するほうがよいでしょうか?

は私が他の場所でこれを聞くと、誰かが答えた:私はまだ、この層は、他の水平層に垂直方向に整列させ、すべての層が、それへのアクセス権を持っているとして、インフラストラクチャ層に資格情報をプルする機能を置きます

。 ASP.NETメンバーシッププロバイダを使用しておらず、暗号化された資格情報を使用するだけのカスタムを使用している可能性があるため、インフラストラクチャレイヤを使用してこれらの資格情報のアクセスをラップし、サービスレイヤにそれらを取得させて渡すことができますが、データがどのように取得/永続化されるかを理解しているレイヤーが多すぎるし、必要な権限アクセスが必要です。

グレート。意味あり。しかし、私はここからどこに行くべきか分からない。ケーススタディからのコード:私は、データベースに接続するのですか

public class AspMembershipAuthentication : ILocalAuthenticationService 
{ 
    public User Login(string email, string password) 
    { 
     User user = new User(); 
     user.IsAuthenticated= false; 

     if (Membership.ValidateUser(email, password)) 
     { 
      MembershipUser validatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = validatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 

     return user; 
    } 

    public User RegisterUser(string email, string password) 
    {    
     MembershipCreateStatus status; 
     User user = new User(); 
     user.IsAuthenticated = false; 

     Membership.CreateUser(email, password, email, 
           Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 
           true, out status); 

     if (status == MembershipCreateStatus.Success) 
     { 
      MembershipUser newlyCreatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = newlyCreatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 
     else 
     { 
      switch (status) 
      { 
       case MembershipCreateStatus.DuplicateEmail: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.DuplicateUserName: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.InvalidEmail: 
        throw new InvalidOperationException(
          "Your email address is invalid"); 
       default: 
        throw new InvalidOperationException(
        "There was a problem creating your account. Please try again."); 
      } 
     } 

     return user; 
    }  
} 

私はメンバシッププロバイダを使用していない場合は、他の可能性のチェックの中で、ユーザー名とパスワードが一致かどうかを確認するには?

+1

認証はアプリケーションレベルの懸案事項です。あなたのドメインの一部ではありません。 – jfar

答えて

3

ILocalAuthenticationServiceを実装するクラスを作成し、必要な呼び出しを行います。

また、ILocalAuthenticationServiceがASP.NET-y(User戻り値タイプ)である場合は、独自のILocalAuthenticationServiceバリアントをロールして実装する必要があります。

ILocalAuthenticationServiceを必要に応じて解決するには、IoCコンテナを使用します。

+0

返事をありがとう。私のインフラストラクチャ層には既にILocalAuthenticationServiceがあり、上記と同様に実装AspMembershipAuthenticationがあります。上記で実装した実装は、既定のメンバシッププロバイダを使用していますが、使用する予定はありません。したがって、インフラストラクチャ層内から、上記の実装がメンバーシッププロバイダと同じようにデータにアクセスしてこれらのチェックを実行する方法を教えてください。 – getoutofmylaboratory

+0

あなたのインフラストラクチャ層はデータレイヤーを見ることができません。あなたの認証サービスがDBを見ることができるどこかのところに住んでいたなら、あなたのクライアントが本当にどこから来たのか気にしないIoCの観点からはどうでしょうか。インフラストラクチャ層でDBが認識されず、認証がdbベースの場合、インフラストラクチャ層には存在しません。すでに理解したとおりです。 – n8wrl

+0

正確に!もともと、私はServiceレイヤーでこれを行うことを計画していました。しかし、私は、「それは事例研究でどのように行われたかではない」ために疑問に思った。だから私は尋ねましたが、懸念事項の分離のためにInfrastructureレイヤーに保管することをお勧めしました(私が投稿した引用文から)。私はそれをサービス層に入れて、私のリポジトリを使ってデータベースと通信できるようにしたいと考えていました。あなたはそれに基づいて何をお勧めしますか? – getoutofmylaboratory