30

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

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

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

やり方はとても簡単でした。

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

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

asp.net メンバーシップ プロバイダーに対する古い OAuth 実装では、この ExtraData ディクショナリ ( ProviderDetail.ExtraData Property ) を使用してこれをキャプチャする方法がありました。

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

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

4

7 に答える 7

5

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);

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

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

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

于 2014-06-26T14:16:34.890 に答える
4

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

于 2013-10-18T13:53:43.660 に答える
3

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

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 が抽出されると、このアバター クレームを受け取り、後で使用するためにユーザー オブジェクトに格納できます。

于 2013-09-16T17:35:06.480 に答える