web-dev-qa-db-ja.com

MVC5フレームワークのOAuth / OWin IDプロバイダーから外部認証プロバイダーを使用してExtraDataを取得する

VS 2013プレビューで新しいMVC5フレームワークを使用しようとしています。

メンバーシップ認証フレームワークが見直され、OWinに置き換えられました。

特に、外部認証プロバイダーのGoogle認証をオンにしました。

それはとても簡単でした。

新しいデフォルトのMVCプロジェクトのApp_StartディレクトリにあるStartup.Auth.csファイルのapp.UseGoogleAuthentication();のコメントを外します。

したがって、アプリケーションに表示するユーザーのアバターへのURLなど、認証プロバイダーから提供される「追加データ」にアクセスしたいと思います。

以前のOAuth asp.netメンバーシッププロバイダーに対する実装)では、このExtraData辞書を使用してこれをキャプチャする方法がありました ProviderDetail.ExtraData Property

OAuthとOWinがどのように連携するか、およびこの追加のデータにアクセスする方法についてのドキュメントはあまり見つかりません。

誰かが私を啓発できますか?

30
tony.adx

最近、Googleプロフィールの写真にもアクセスする必要がありました。解決方法は次のとおりです...

Startup.Auth.csファイルでコードapp.UseGoogleAuthentication();を有効にしただけでは十分ではありません。この場合、Googleはプロファイルの写真に関する情報をまったく返さないためです(または方法がわかりませんでした)それを得る)。

本当に必要なのは、デフォルトで有効になっているOpen IDの代わりにOAuth2統合を使用することです。そして、ここに私がそれをした方法があります...

まず、Google側でアプリを登録し、「クライアントID」と「クライアントシークレット」を取得する必要があります。これが完了するとすぐにさらに先に進むことができます(後で必要になります)。これを行う方法の詳細情報 ここ

app.UseGoogleAuthentication();

    var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
    {
        ClientId = "<<CLIENT ID FROM GOOGLE>>",
        ClientSecret = "<<CLIENT SECRET FROM GOOGLE>>",
        CallbackPath = new PathString("/Account/ExternalGoogleLoginCallback"),
        Provider = new GoogleOAuth2AuthenticationProvider() {
            OnAuthenticated = async context =>
            {
                context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
                context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
            }
        }
    };

    googleOAuth2AuthenticationOptions.Scope.Add("email");

    app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

その後、コードを使用して、他のプロパティと同じ方法でプロファイルの画像のURLにアクセスできます。

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var pictureClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picture"));
var pictureUrl = pictureClaim.Value;
17
Mr. Pumpkin

Asp.net IDの RTWバージョン を使用すると、ExternalLoginCallback内の次のコードがそれを行います。

var externalIdentity = await HttpContext.GetOwinContext().Authentication
    .GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var displayName = externalIdentity.Name;
var email = externalIdentity.FindFirstValue(ClaimTypes.Email);
7
aleyush

Alex Wheatの回答を使用して、Google認証を使用してgoogle +プロフィール、性別、および電子メールを取得するためのソリューションを思いつきました。

Startup.Auth.cs:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "<<client id - google>>",
    ClientSecret = "<<secret for your app>>",
    Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = context =>
        {
            var userDetail = context.User;
            context.Identity.AddClaim(new Claim(ClaimTypes.Name,context.Identity.FindFirstValue(ClaimTypes.Name)));
            context.Identity.AddClaim(new Claim(ClaimTypes.Email,context.Identity.FindFirstValue(ClaimTypes.Email)));

            var gender = userDetail.Value<string>("gender");
            context.Identity.AddClaim(new Claim(ClaimTypes.Gender, gender));

            var picture = userDetail.Value<string>("picture");
            context.Identity.AddClaim(new Claim("picture", picture));

            return Task.FromResult(0);
        },
    },
};
googleOptions.Scope.Add("https://www.googleapis.com/auth/plus.login");
googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email");

app.UseGoogleAuthentication(googleOptions);

拡張プロファイルデータにアクセスするには、plus.loginとuserinfo.emailの2つのスコープをリクエストに追加する必要があります。 plus.loginスコープのみを追加すると、ユーザーの電子メールを表示できなくなります。認証にASP.NET MVC5のデフォルトテンプレートを使用する場合、ユーザーの電子メール、名前、姓、google +プロフィールアドレスのみが表示されます。ここに示す方法を使用すると、ユーザーの画像リンクにもアクセスできます。

Context.Userプロパティは、ネットワークを介して送信されるユーザーのデータのJSONシリアル化を伝達し、ユーザーがキーでプロパティを検索できるようにする便利なメソッドを備えています。

ログインスコープの概念の詳細については、次をご覧ください https://developers.google.com/+/api/oauth#login-scopes

5

次の投稿では、ソーシャルプロバイダーから追加データを取得する方法について詳しく説明します http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social -providers-used-in-the-vs-2013-project-templates.aspx

4
pranav rastogi

以下は、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の両方のメールアドレスが表示されます。

更新:適切で完全な解決策については、代わりにこの投稿を参照してください。 デフォルトのMVC5アプリでのアカウント関連付けステップ中に外部プロバイダーGoogleおよびFacebookからメールを取得する

4
PussInBoots

残念ながら、これは非常に簡単ではありません。これを行う1つの方法は、GoogleProvider Authenticatedイベントをフックし、アバターを使用してカスタムIDをClaims Identityに追加することです。

public class MyGoogleProvider : GoogleAuthenticationProvider {
    public override Task Authenticated(GoogleAuthenticatedContext context) {
        context.Identity.AddClaim(new Claim("avatarClaim", "<fetch avatar url here>"));
        return base.Authenticated(context);
    }
}

app.UseGoogleAuthentication(new GoogleAuthenticationOptions() { Provider = new MyGoogleProvider() });

次に、AccountController内で、外部IDが抽出されると、このアバター要求を取得して、後で使用するためにユーザーオブジェクトに保存できます。

3
Hao Kung

ここ はAndrewPollandからの良い答えです。私のために働きなさい。彼は新しいoauthアクセストークンを使用して、ログイン後にユーザー情報を取得します。 ここから Deepak Goswamiは、このAPI呼び出しの使用方法を説明しています。

0
chfumero