25

FacebookAuthenticationOptionsのオブジェクトにスコープを追加することで、Facebook プロバイダーでこれを行うことができるようですStartup.Auth.cs

http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx

List<string> scope = new List<string>() { "email" };
var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
...
app.UseFacebookAuthentication(x);

Google プロバイダーで同じことを行うには? クラス/オブジェクトのx.Scopeプロパティがありません!GoogleAuthenticationOptions

4

3 に答える 3

47

この投稿の下部にある最新情報をご覧ください。

Facebookの場合、次のように機能します。

StartupAuth.cs:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
{
    AppId = "x",
    AppSecret = "y"
};
facebookAuthenticationOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookAuthenticationOptions);

ExternalLoginCallback メソッド:

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

Googleの場合:

StartupAuth.cs

app.UseGoogleAuthentication();

ExternalLoginCallback メソッド (facebook と同じ):

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

ここにブレークポイントを設定すると:

var email = emailClaim.Value;

デバッガーに Facebook と Google の両方のメール アドレスが表示されます。

更新 1 : 古い回答は混乱していたので、デバッグしたばかりの自分のプロジェクトにあるコードで更新し、動作することがわかっています。

更新 2 : 新しいASP.NET Identity 2.0 RTMバージョンでは、この投稿のコードは必要ありません。電子メールを取得する適切な方法は、次の手順を実行するだけです。

  1. Startup.Auth.cs

        app.UseFacebookAuthentication(
           appId: "x",
           appSecret: "y");
    
        app.UseGoogleAuthentication();
    
  2. AccountController.cs

    //
    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }
    
        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInHelper.ExternalSignIn(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresTwoFactorAuthentication:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
            case SignInStatus.Failure:
            default:
                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }
    
于 2013-12-04T15:41:37.013 に答える
6

認証されたユーザーから電子メール アドレスを取得するには、FacebookAuthenticationOptions を明示的に構成する必要があります。

MVC5 プロジェクトで、これらの行を Startup.Auth.cs に追加します。

        var options = new FacebookAuthenticationOptions() {
            AppId = "xxxxxxxx",
            AppSecret = "xxxxxxxxx"
        };
        options.Scope.Add("email");
        app.UseFacebookAuthentication(options);

更新 サンプル コードを最小限に抑えました。ちなみに、更新されたコードは問題なく動作します。Facebook と Google の両方でも試しました。

于 2014-01-07T22:02:56.343 に答える