30

我正在尝试在 VS 2013 预览版中使用新的 MVC5 框架。

会员身份验证框架已经过大修并替换为OWin.

特别是,我打开了外部身份验证提供程序 Google auth。

这很简单。

只需取消注释此行: app.UseGoogleAuthentication();在新的默认 MVC 项目的 App_Start 目录中的 Startup.Auth.cs 文件中。

因此,我想访问来自身份验证提供程序的“额外数据”,例如要在我的应用程序中显示的用户头像的 url。

在针对 asp.net Membership 提供程序的旧 OAuth 实现下,有一种方法可以使用此处找到的 ExtraData 字典来捕获它:ProviderDetail.ExtraData Property

我找不到太多关于 OAuth 和 OWin 如何协同工作以及如何访问这些额外数据的文档。

任何人都可以启发我吗?

4

7 回答 7

17

最近我也不得不访问谷歌个人资料的图片,这就是我解决它的方法......

如果您只是启用app.UseGoogleAuthentication();Startup.Auth.cs 文件中的代码,这还不够,因为在这种情况下,Google 根本不会返回有关个人资料图片的任何信息(或者我不知道如何获取它)。

您真正需要的是使用 OAuth2 集成而不是默认启用的 Open ID。这就是我是如何做到的......

首先,您必须在 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;
于 2014-03-27T17:02:26.613 回答
7

使用RTW 版本的 asp.net 身份,下面的代码ExternalLoginCallback可以为我做到这一点。

var externalIdentity = await HttpContext.GetOwinContext().Authentication
    .GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var displayName = externalIdentity.Name;
var email = externalIdentity.FindFirstValue(ClaimTypes.Email);
于 2013-10-17T10:15:35.273 回答
5

使用 Alex Wheat 的回答,我想出了一个使用 Google 身份验证检索 google+ 个人资料、性别和电子邮件的解决方案。

启动.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。如果您只添加 plus.login 范围,您将无法看到用户的电子邮件。如果您使用 ASP.NET MVC5 的默认模板进行身份验证,它将仅显示用户的电子邮件、姓名、姓氏和 google+ 个人资料地址。使用此处显示的方式,您还可以访问用户的图片链接。

context.User 属性携带通过网络发送的用户数据的 JSON 序列化,并具有让用户通过其键查找属性的有用方法。

要了解有关登录范围概念的更多信息,请查看: https ://developers.google.com/+/api/oauth#login-scopes

于 2014-06-26T14:16:34.890 回答
4

以下适用于我的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;

对于谷歌:

启动验证.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 获取电子邮件

于 2014-01-08T10:47:43.947 回答
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

So unfortunately this is not super straightforward, one way you can do this is to hook the GoogleProvider Authenticated event and add a custom claim to the Claims Identity with the avatar:

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

Then inside of your AccountController, when the external identity is extracted, you can take this avatar claim and store it into your user object for use later.

于 2013-09-16T17:35:06.480 回答
0

是 AndrewPolland 的一个很好的回答。为我工作。他使用新的 oauth 访问令牌在登录后检索用户信息。从这里Deepak Goswami 解释如何使用这个 api 调用。

于 2015-03-25T00:12:15.677 回答