asp.net mvc - asp - MVC 5 Owin Facebook Auth 結果 Null 参照例外



asp.net-mvc asp.net-mvc-5 (8)

Hongye Sunは彼の答えですべての重い吊り上げをしました。

ここでは、あなたのコントローラクラスに追加することができ、問題のあるAuthenticationManager.GetExternalLoginInfoAsync()の代わりに呼び出されるコードをいくつか示します。

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_Workaround()
{
    ExternalLoginInfo loginInfo = null;

    var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);

    if (result != null && result.Identity != null)
    {
        var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
        if (idClaim != null)
        {
            loginInfo = new ExternalLoginInfo()
            {
                DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""),
                Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value)
            };
        }
    }
    return loginInfo;
}

https://ffff65535.com

私は、Visual Studio 2013の新しいMVC 5プロジェクトに統合されたOWIN Facebook認証を設定しようとしています。このチュートリアルのように、アプリとキーを設定しました:

http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

しかし、AccountControllerでこの呼び出しからNullReferenceExceptionがスローされています。

    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

私はすでにFiddlerの反応をチェックして、Facebookからの成功の応答であるように見えますが、まだこのエラーが発生しています。 応答は次のようになります。

{"id":"xxx","name":"xxx","first_name":"xxx","last_name":"xxx","link":
"https:\/\/www.facebook.com\/profile.php?id=xxx","location":{"id":"xxx","name":"xxx"},
"gender":"xxx","timezone":1,"locale":"en_GB","verified":true,"updated_time":"2013-10-23T10:42:23+0000"}

httpとhttpsのデバッグ時にこれを取得します。 私はこれがフレームワークのバグだと推測していますが、これまでリフレクターを通してこれを診断して空白を描きました。


これはおそらくアイデンティティOWIN拡張コードのバグです。 facebookのペイロードがjsonのユーザー名フィールドを返すので、問題を再現することはできません。これはあなたのfbレスポンスにはありません。 なぜそれがないのか、私は確信していません。

identity owin拡張メソッドのコードには、ユーザー名フィールドと同じIDの名前要求に対するヌルチェックがありません。 内部的にバグを提出しました。

この問題を回避するには、ExternalLoginCallbackメソッドを次のコードに置き換えてみてください。

   [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);
        if (result == null || result.Identity == null)
        {
            return RedirectToAction("Login");
        }

        var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
        if (idClaim == null)
        {
            return RedirectToAction("Login");
        }

        var login = new UserLoginInfo(idClaim.Issuer, idClaim.Value);
        var name = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", "");

        // Sign in the user with this external login provider if the user already has a login
        var user = await UserManager.FindAsync(login);
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
            return RedirectToLocal(returnUrl);
        }
        else
        {
            // If the user does not have an account, then prompt the user to create an account
            ViewBag.ReturnUrl = returnUrl;
            ViewBag.LoginProvider = login.LoginProvider;
            return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { UserName = name });
        }
    }

facebook / googleからのユーザー名がない場合、コードはデフォルトのユーザー名を空に設定します。


私はGoogle+ APIを有効にしておらず、フィドラーを見たときにaccess_deniedで戻ってきました。 Google+ APIを有効にすると、問題が分類されました。


私はVisual Studio 2015テンプレート/ WebAPI 2用の最新のボイラープレートコードのノートを投げたいと思っていました。私はGoogle認証でこの問題を抱えていましたが、Facebookや他のソーシャルログインに似ています。 私は最新のOwinを持っていて、他のナゲットパッケージは最新のものでした。 最新のout-of-the-box web api 2テンプレートが登場しました。私はちょうどGoogleから返される "email"を特に要求する必要がありました。 この行がなければ、api / Account / Register呼び出しはエラーになります。

もちろん、あなたのアプリがGoogleに登録されていて、あなたのサイトに電話が許可されていることを確認してください。 これらの手順を示す良い例がたくさんありhttps://console.developers.google.com/apis

ここでは、App_Start \ Startup.Auth.csファイルの私の調整です:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "xxx",
    ClientSecret = "xxx"
};
googleOptions.Scope.Add("email"); //!! Add this !!
app.UseGoogleAuthentication(googleOptions);

.Add( "email")行を追加するまで、api / Account / RegisterExternal WebAPI 2呼び出し(AccountController.cs)は、RegisterExternalのこのセクションからnullを返します。

var info = await Authentication.GetExternalLoginInfoAsync();
if (info == null) //This would be true, and it would error.
{
      return InternalServerError();
}

これはこのエラーのために出てくる少数の記事の1つなので、私は後世のために自分のノートに私のソリューションにタグを付けると思いました。 (特に郵便配達のテストプロセス!)

だから、テストですべてを動作させるには:1)次のようにapi / Account / ExternalLogins URLを呼び出します。

http://localhost:59137/api/Account/ExternalLogins?returnUrl=%2F&generateState=true

次のような応答が得られるはずです。

<ArrayOfExternalLoginViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TCG_DL_API.Models">
<ExternalLoginViewModel>
<Name>Google</Name>
<State>1phegLF241xeSfd8gZAsCXiBAp3l5bMygg2VSeRXAHk1</State>
<Url>
/api/Account/ExternalLogin?provider=Google&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A59137%2F&state=1phegLF241xeSfd8gZAsCXiBAp3l5bMygg2VSeRXAHk1
</Url>
</ExternalLoginViewModel>
</ArrayOfExternalLoginViewModel>

2)その後、レスポンスからURLを取得し、それを呼び出します。 あなたは、Googleのログインプロンプト/ページを取得する必要があります。 (あるいは、あなたが設定したものなら、私はFacebookやTwitterを想定しています)

3)ログインすると、リダイレクトページに戻ります。 次のようなURLがあります:

http://localhost:59137/#access_token= d5asC1arCUXaLEMgBS8PT_uwZcTJqC1UZbXblNZ3hMOh3TSKtEXYeKtyKBTv3WmLcaLGGomSvpRSFMfXPxpPvNRgjUVWAiqxtKfv3qWHNqfIMeu5j0eZrJDRAMTrYFgflSbEopAe909a31I4mQnJuvaiITHYPrLmqkm6J88HAVx8F981_q_tflu4A72k3KaB-m2wd0-p1jdQnNMlixM2Wfloh_niUTBIOYUPc1SkKWcZxuI6dzN2Z0PmWHDwzJI8nM8vOuzybJIsxLOyTY1VfzSQ5Qzcll3HhifLPkyZxvXDQ5LHqW1v0_AztsUWkEhW_AJzmw2IaOcTtHCmkmWm1K444okNtOsYfs6HFui0NeY&TOKEN_TYPE =ベアラー&expires_in = 1209600&状態= 3FSOd3_n_sEL4QtiELWPG5B2_H3wRjVb75uDjQS16gk1

トークン(上の太字)をつかんでベアラトークンとして使用してください。

4)あなたが登録されていないので(あなたがベアラトークンを持っているので)、POST API / Account / RegisterExternal

5)応答はOKで、AspnetUserテーブルを見ると、新しいAspnetUsersレコードと、プロバイダとしてgoogle用の新しいAspNetUserLoginsレコードがあることがわかります。

私はこれが仕事にこの物を得ようとしている人に役立つことを願っています!


私は同じチュートリアルに従うことでまったく同じ問題を抱えていました。 Visual Studioのメニュー - >ツール - >ライブラリパッケージマネージャ - >ソリューションのNuGetパッケージの管理...をクリックし、パッケージをインストールします。Microsoft.Owin.Host.SystemWeb 2>同じウィンドウ(Update)(左のバー)をクリックし、すべてのパッケージを更新します。

この答えが同じ問題を抱えている他の人に役立つことを願っています。


私は同じ問題に直面しました。ライブラリをチェックしたとき、Microsoft ASP.NET Identity Owin 1.0.0を使用していました。コマンドを使用してMicrosoft ASP.NET Identity Owin 2.0.1に更新しました.PM> Install-Package Microsoft.AspNet.Identity.Owin -Version 2.0.1これで問題が修正されました。


私は最新のVS 2013.3テンプレートでこれを取得し始めました。認証が、他のプロジェクトから不必要に移植されたFormsAuthenticationでうまくいっていないことに気付きました。 私はそれを修正するために何をしたのです:

<system.web><authentication mode="None" />...追加しました

<system.webServer><modules><remove name="FormsAuthentication" /></modules>...追加しました<system.webServer><modules><remove name="FormsAuthentication" /></modules>...


私も同じ問題がありました。 私は自分の問題を解決するだけでapp.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);追加しましたapp.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); Startup.Auth.csに追加します。 私はStartup.Auth.csでそれを持っていなかった

var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);

オブジェクトエラーのインスタンスに設定されていないオブジェクト参照を常に投げてください。 私はMVC 5のVS 2013のデフォルトのテンプレートを分析してそれを把握します。したがって、コード構造や例についての詳細が必要な場合は、VS 2013 MVC5テンプレートを見てください。





asp.net-identity