2017-07-10 20 views
0

ASP.NET IDを使用して外部ログインを追加するためのデフォルトコードに問題があります。ASP.NET ID AddLoginAsyncが失敗しました - 名前/電子メールXがすでに取得されています

私は自分のアカウントコントローラExternalLoginConfirmationメソッドに次のコードを持っている:

var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var result = await UserManager.CreateAsync(user); 
if (result.Succeeded) 
{ 
    result = await UserManager.AddLoginAsync(user.Id, info.Login); 
    if (result.Succeeded) 
    { 
     //do stuff 
    } 
} 

==真result.Succeeded CreateAsyncの呼び出しが戻ります。それはAddLoginAsync方法を流れる際しかし、そのメソッドの戻りはresult.Succeeded ==以下のエラーが発生した偽:私はaspnetusersテーブルに見るときから予想されるように、私はこのユーザーの新しい行を参照してください

Name [email protected] is already taken. 
Email '[email protected]' is already taken. 

CreateUserAsyncメソッド。 AddLoginAsyncが既存のユーザーにログインを追加することになっている場合、ユーザーが存在しないと予想していたのと同じようにエラーが発生するのはなぜですか?新しいユーザーインスタンスでUserNameとEmailを事前に入力していない状態でCreateAsyncを呼び出すことはできません。

デフォルトのID設定との唯一の違いは、stringの代わりにIDにintを使用するCustomer ApplicationUserクラスを作成したことです。

アイデア?

答えて

-1

外部ログインプロバイダを使用していますか?そうでなければ、AddLoginAsync()を呼び出すべきではありません。

CreateAsync(ユーザー)は、ローカル環境でユーザーレコードを作成しています。その後、SignInAsync()を使用してユーザーをログすることもできますが、AddLoginAsync()を呼び出す必要はありません。

+0

前述のとおり、これはExternalLoginConfirmation ActionResultメソッドの内部にあります。外部ログインプロバイダを使用している場合にのみヒットします。外部ログインプロバイダ(この場合はFacebook)が既にユーザーを検証してその情報を渡したときに発生します。ユーザー名を入力して登録プロセスを完了します。 – Granicus

0

エラーメッセージは赤ん坊です。これは、新しいWebアプリケーションを作成するときにMSが提供するデフォルトのコードですが、CreateAsync呼び出しはuserオブジェクトを更新せず、信じられるようになります。この場合、AddLoginAsyncに渡されたときにuser.Idは0に等しいので、ユーザーが作成されている間はオブジェクトの現在のインスタンスはありません。問題を修正

var newuser = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var result = await UserManager.CreateAsync(newuser); 
var user = await UserManager.FindByEmailAsync(model.Email); 

var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var result = await UserManager.CreateAsync(user); 

を変更

+0

もちろん、新しいユーザーを作成しようとしていますが、ユーザー作成の結果は評価されません。 Succeeded = falseの場合、またはErrorsコレクションに何かがある場合にはどうなりますか? – RichieMN

関連する問題