通过Google OAuth2进行日志记录时设置User.Identity.Name

时间:2015-03-27 15:11:19

标签: asp.net oauth-2.0 asp.net-mvc-5 google-oauth google-oauth2

我正在开发一个使用Google身份验证的小型MVC5网站,但我想在没有ASP.NET身份的情况下这样做。

到目前为止,我已按照此博客文章中的步骤进行操作登录:http://coding.abel.nu/2014/11/using-owin-external-login-without-asp-net-identity/

但是目前User.Identity.Name被设置为用户的全名。我想将其设置为用户的电子邮件地址,因为我更喜欢将其设置为用户的主键。到目前为止,我的代码完全取决于该博客文章中的内容。

我可以使用以下代码检索用户的电子邮件地址,但这只是在用户通过身份验证后才能使用。

ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;

我已经尝试覆盖了对于GoogleOAuth2ProviderOptions的OnAuthenticated,并发现有一个NameClaimType但它只是readonly。

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "...",
            ClientSecret = "...",
            Provider = new GoogleOAuth2AuthenticationProvider()
            {
                OnAuthenticated = async context =>
                {
                    context.Identity.NameClaimType = ClaimTypes.Email;
                }
            }
        });

我无法找到任何其他可以让我设置User.Identity.Name设置的内容。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在用户向Google帐户注册时,一般情况下会创建一个新的本地帐户并将其链接到Google登录信息。在那里,您需要创建该用户,如下所示。 (取自模板)

 var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = await UserManager.CreateAsync(user);

在这里,您需要将用户名字段设置为电子邮件以满足您的需求

答案 1 :(得分:1)

想想我修好了。我创建了自己的IGoogleOAuth2AuthenticationProvider实现,它删除了Name声明并使用Google提供的电子邮件重新添加。不确定这是否是最好的方法,但它有效。

public class GoogleAuthProvider : IGoogleOAuth2AuthenticationProvider 
{
    public void ApplyRedirect(GoogleOAuth2ApplyRedirectContext context)
    {
        context.Response.Redirect(context.RedirectUri);
    }

    public System.Threading.Tasks.Task Authenticated(GoogleOAuth2AuthenticatedContext context)
    {
        context.Identity.RemoveClaim(context.Identity.FindFirst(ClaimTypes.Name));
        context.Identity.AddClaim(new Claim(ClaimTypes.Name, context.Email));
        context.Identity.AddClaim(new Claim(ClaimTypes.Email, context.Email));
        return Task.FromResult<object>(null);
    }

    public System.Threading.Tasks.Task ReturnEndpoint(GoogleOAuth2ReturnEndpointContext context)
    {
        return Task.FromResult<object>(null);
    }
}

然后在设置GoogleOauth

时连接提供商
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
            {
                ClientId = "...",
                ClientSecret = "...",
                Provider = new GoogleAuthProvider()
            });