3

プロジェクトで2つのプロバイダーを混在させようとしていると思いますが、フォーム認証と組み合わせてWebセキュリティを使用したいと考えています。Facebookとgoogleを使用したOAUTH認証にはWebセキュリティが必要です。

Facebookを使用してログインしようとするとエラーが発生します

このメソッドを呼び出すには、Membership.Providerプロパティがのインスタンスである必要がありますExtendedMembershipProvider

これがコードサンプルです。どうすれば両方を使用できますか?

public ActionResult ExternalLoginCallback(string returnUrl)
        {
            AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
            if (!result.IsSuccessful)
            {
                return RedirectToAction("ExternalLoginFailure");
            }

            if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
            {
                return RedirectToLocal(returnUrl);
            }

            if (User.Identity.IsAuthenticated)
            {
                // If the current user is logged in add the new account
                OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                // User is new, ask for their desired membership name
                string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
                ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
                ViewBag.ReturnUrl = returnUrl;
                return View("ExternalLoginConfirmation", new RegisterExternalLoginModel { UserName = result.UserName, ExternalLoginData = loginData });
            }
        }

public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
4

3 に答える 3

3

MVC4 ExtendedMembershipProvider および entityframeworkと同じ問題に関連している可能性があり ます。ユニバーサル プロバイダーの nuget パッケージを削除すると、この特定のエラーが消えました。

また、Jon Galloway によるこの「ごく最近の」記事も役立つかもしれません。

于 2012-08-30T14:39:22.183 に答える
1

Visual Studio を使用している場合は、この労力をすべて節約したいと思うかもしれません。MVC 4 インターネット テンプレートには、すぐに使用できる 4 つの外部 ID プロバイダーが付属しています。それらをテストしたところ、Google アカウント、Microsoft アカウント、Facebook ログイン、および Twitter ログインはすべて問題なく動作し、コード行は 1 行もありません!

Web フォーム テンプレートでも同じことが提供されていると思います。

詳細については、http://blogs.msdn.com/b/webdev/archive/2012/08/15/oauth-openid-support-for-webforms-mvc-and-webpages.aspxを参照してください。

于 2012-10-06T17:24:33.807 に答える
0

の実装を使用できますExtendedMembershipProvider。例: 組み込みのSimpleMembershipProvider.

すべてExtendedMembershipProvider の IS A MembershipProvider .

詳細については、Jon Galloway のブログをご覧ください。

于 2012-12-24T10:28:22.203 に答える