2015-09-13 21 views
7

ドキュメントはまったくありません。ASP.NET 5 MVC 6 NoSQL IDプロバイダを実装する方法

私は自分自身のIUser、自分のIUserStoreを実装しなければならず、何とかそれらをstartup.csに登録しなければならないことは知っています。 NoSQLバックエンドを使用したいので、EntityFrameworkへの参照をすべて削除しました。

「慣習」の哲学は、文書化され公開されている限り非常に素晴らしいです。

ヒント?

+0

この質問とよく似ています。http://stackoverflow.com/questions/31795792/example-of-using-asp-net-identity-3-0-without-entity-framework/31813863 –

+0

ありがとうございます。私はヒューリスティックに学習しています。レガシーIdentityパッケージを使用しないように注意してください。私の場合だった。今私は、AddIdentityでのカスタムUserStoreとRoleStoreの登録後に例外を解決しています。().AddUserStore ().AddRoleStore ().AddDefaultTokenProviders(); – user2715109

+1

これは、MongoDB.Driver(> = v2.1.0) https:// githubのEntity Frameworkを使用しない、ASP.NET 5 Identity(> = v3)フレームワークを実装した、うまく動作している例(MVC 6)およびlibです。 com/saan800/SaanSoft.AspNet.Identity3.MongoDB –

答えて

8

私はちょうどIdentity 2.0のカスタム実装を行いました。あなたが言ったように、私は有用なドキュメントを見つけませんでした。しかし、幸いにも私は自分の目標を達成することができました。

N層アーキテクチャを使用しており、ビジネスロジックとデータアクセスレイヤのビジネスロジックからビューを分離していると仮定して質問に答えます。また、Unityなどの依存性注入コンテナが使用されていると仮定します。

私は、カスタムデータアクセスとアイデンティティフレームワークを使用するために必要な手順を説明します:

まず、あなたがそれにカスタムプロパティを追加し、あなたがしたい場合は、たIUserの実装、ドメインクラスを宣言しており、 :

//This class is implementing IUser with Guid as type because 
//I needed to use Guid as default Id. 
public class CustomUser : IUser<Guid> 
{ 
     public string CustomProperty { get; set; } 
} 

次に、ビジネスロジックレイヤーには、ユーザーの承認、ログイン、パスワードの回復に関連するすべてのタスクを処理するクラスが必要です。このクラスは、UserManagerから継承する必要があります。結果は以下のように何かのようになります。

// Business layer class must inherit from UserManager with 
// CustomUser and Guid as types 
public AuthorizationManager : UserManager<CustomUser, Guid>, IAuthorizationManager 
{ 
     private readonly ICustomUserMongoRepository repository; 
     private readonly ICustomEmailService emailService; 
     private readonly ICustomTokenProvider tokenProvider; 

     // Parameters being injected by Unity. 
     // container.RegisterType<ICustomUserMongoRepository, CustomUserMongoRepository>(); 
     // .. 
     // .. 
     public AuthorizationManager(
        ICustomUserMongoRepository repository, 
        ICustomEmailService emailService, 
        ICustomTokenProvider tokenProvider 
        ) 
           // calling base constructor passing 
           // a repository which implements 
           // IUserStore, among others. 
           : base(repository) 
     { 
      this.repository = repository; 

      // this.EmailService is a property of UserManager and 
      // it has to be set to send emails by your class 
      this.EmailService = emailService; 

      // this.UserTokenProvider is a property of UserManager and 
      // it has to be set to generate tokens for user password 
      // recovery and confirmation tokens 
      this.UserTokenProvider = tokenProvider; 
     } 
} 

のUserManagerから継承する場合は、それがアイデンティティで使用される一連のメソッドを提供し、それがベースのリポジトリを渡すコンストラクタではなく、任意のリポジトリを呼び出すために、あなたのクラスを強制されます、要件に応じて、IUserStore、IPasswordStoreというインターフェースをリポジトリに実装することが必須です。

ここはクールなことが起こるときです。データアクセス層では、NoSQLデータベースに接続する独自のリポジトリパターンの実装が必要です(Mongoと仮定しましょう)。だから、あなたのICustomUserMongoRepositoryはこのようなものになります。

public interface ICustomUserMongoRepository : IUserPasswordStore<CustomUser, Guid>, IUserEmailStore<CustomUser, Guid>, IUserRoleStore<CustomUser, Guid> 
{ 
} 

をそして、あなたのMongoのリポジトリがこの

public CustomUserMongoRepository : MongoRepository<CustomUser>, ICustomUserMongoRepository 
{ 
     // Here you must have your custom implementation (using Mongo) of 
     // ICustomUserRepository which is requesting your class to 
     // implement IUserPasswordStore methods as well 

     public Task CreateAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task DeleteAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task GetEmailAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task GetEmailConfirmedAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     // ... 
} 

のようなものでなければなりませんそして、最終的にあなたのコントローラは、次のようになります。

public class AuthController : Controller 
{ 

    private readonly IAuthorizationManager manager;   

     // Manager being injected by Unity. 
     // container.RegisterType<IAuthorizationManager, AuthorizationManager>(); 
    public AuthController(IAuthorizationManager manager) 
    { 
      this.manager = manager; 
    } 

    // Receives a LogInViewModel with all data needed to allow users to log in 
    [HttpPost] 
    public async Task<ActionResult> LogIn(LogInViewModel viewModel) 
    { 
     // FindAsync it's a method inherited from UserManager, that's 
     // using the Mongo repository passed to the base class 
     // in the AuthorizationManager constructor 
     var user = this.manager.FindAsync(viewModel.Email, viewModel.Password); 

     if(user != null){ // Log in user and create user session } 
     else { // Wrong username or password } 

    } 
} 

重要!

インターフェイスIAuthorizationManagerは、SOLIDの原則に基づいて高品質のソフトウェアを提供するために使用されます。さらに詳しく見ると、このインターフェイスには、UserManagerクラスからAuthorizationManagerによってすべての継承されたメソッドを呼び出すことを許可するすべてのUserManagerのメソッドが必要であることがわかります。

長い投稿。このプロセス全体を数行で説明するのはかなり難しいです。私はそれが助けて欲しいご不明な点やご質問がございましたら、この回答にコメントしてください。できるだけ早く返信いたします。

+1

ありがとうございました!私はすでにアイデンティティ3のアイデンティティクラスを実装しました。アイデンティティ2よりもはるかに簡単です。アイデンティティ3でUserStoreとRoleStoreをオーバーライドするだけです! – user2715109

+0

まだ良いです。ご挨拶 – wilsotobianco

関連する問題