我正在开发一个使用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设置的内容。有什么想法吗?
答案 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()
});