2015-10-03 10 views
5

私はIUserStoreのカスタム実装を書いています。作成メソッドのシグネチャは、次のとおりIUserStore <TUser> .CreateAsync:カスタム実装の失敗を示す方法?

public async virtual Task CreateAsync(TUser user) 

そして、それはMicrosoft.AspNet.IdentityコアインタフェースIUserStoreを考慮して理にかなっている(同じである)です。

Microsoft.AspNet.Identityで定義されたUserManagerクラスのインタフェースであるしかし:

public virtual Task<IdentityResult> CreateAsync(TUser user); 

私の問題は、私は私は戻り値の型以降のUserManagerにこのIdentityResultを渡す必要があるかを確認していないですストアは単純に "タスク"です。ユーザーを作成できるかどうかを判断するカスタムロジックがあるため、CreateAsyncの結果をUserManagerに伝える必要があります。

+0

は、その例外的なケースであるか、実行の通常の流れの一部ですか? –

+0

@YuvalItzchakovありがとうございました!それは通常の実行フローの一部です。私は基本的に、彼らは常にtrueを返しビジネスロジック – reddy

答えて

4

あなたがIUserStore.CreateAsyncを呼び出すことが前に見ることができます(これは、Identity 2.0用です)source code for UserManager.CreateAsyncを見ると、それは実際に関連するIdentityResultオブジェクトを返す責任があるIIdentityValidator<TUser>.ValidateAsyncに呼び出し、作る:

public virtual async Task<IdentityResult> CreateAsync(TUser user) 
{ 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user).ConfigureAwait(false); 
     var result = await UserValidator.ValidateAsync(user).ConfigureAwait(false); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (UserLockoutEnabledByDefault && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true).ConfigureAwait(false); 
     } 
     await Store.CreateAsync(user).ConfigureAwait(false); 
     return IdentityResult.Success; 
} 

IUserStore.CreateAsyncの主な目的は、データを保存する基になるデータソースを呼び出すことです。実際にIIdentityValidator<TUser>を実装して、UserManagerインスタンスに設定したいと思うようです。ユーザーが作成することがカントのアプリケーション・フローでは、

+0

私たちはまったく同じ時間!あなたの助けてくれてありがとうございます。私は間違いなくIUserValidatorを見ていきます。 – reddy

+0

@ red2nb GitHubでソースをブラウズしてから、ASP.NET 5のために気づいたので、代わりにSymbolSourceを見ました。インタフェースは実際には 'IIdentityValidator 'と呼ばれ、私の答えは –

+0

に更新されました。実際にはまだ問題があります。私がやっている妥当性チェックは完全性チェックです。 UserValidatorに依存することで、このバリデータが呼び出されるコンテキスト(作成、更新など)が不足しています。私は、このバリデーターは、プロパティが設定されているかどうか、そしてこの種のものをチェックするために主にそこにあると思います。 – reddy

2

答えはここに、in the source codeある記事の執筆時点でのUserManagerでの実装の一部です:

public virtual async Task<IdentityResult> CreateAsync(TUser user, 
     CancellationToken cancellationToken = default(CancellationToken)) 
    { 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user, cancellationToken); 
     var result = await ValidateUserInternal(user, cancellationToken); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (Options.Lockout.EnabledByDefault && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, cancellationToken); 
     } 
     await UpdateNormalizedUserNameAsync(user, cancellationToken); 
     await Store.CreateAsync(user, cancellationToken); 
     return IdentityResult.Success; 
    } 

だから、基本的に、彼らは常にtrueを返します。これは、現在のバージョンでは、私の作成チェックをUserStoreに置くことは、フレームワークの意図された使い方に反することを意味します。

しかし、私はこれが次のリリースで変更されることに気付きました。 IUserStoreインターフェースはなります:

Task<IdentityResult> CreateAsync(TUser user, CancellationToken cancellationToken); 

とのUserManager実装:

public virtual async Task<IdentityResult> CreateAsync(TUser user) 
    { 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user); 
     var result = await ValidateUserInternal(user); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (Options.Lockout.AllowedForNewUsers && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, CancellationToken); 
     } 
     await UpdateNormalizedUserNameAsync(user); 
     await UpdateNormalizedEmailAsync(user); 

     return await Store.CreateAsync(user, CancellationToken); 
    } 

だからUSERSTOREで作成ロジックは、その時点で可能になります置きます。これはクライアントが完全性の懸念を処理する必要がないので、私の意見ではより良い設計となるでしょう。

+1

*に焦点を当てたクライアントを維持するためにUSERSTOREで直接このケースを処理する理由多くのコンテキストを与えるために、私は別のアセンブリ内ASP.Identityの私のカスタム実装を行っていますが、これはあります*コードをもう一度見てみると、 'ValidateAsync'の呼び出しで成功以外のものが返された場合、エラーを含む' IdentityResult'が返されます。実際には常に真実を返すわけではありません。 –

+0

あなたはこの質問で私を助けてください:http://stackoverflow.com/questions/39275597/how-to-give-custom-implementation-of-updateasync-method-of-asp-net-identity –

関連する問題