我在asp.net 4.5(不是asp.net core (中有一个网站。
我正在使用login.aspx页面上的Google按钮来登录用户,这是Visual Studio 2017社区中的标准模板。
当我查看Visual Studio 2017中的代码时,我可以看到RegisterExternalLogin.aspx.cs
中对Google获得身份验证信息的代码(即,以下代码中的LoginInfo变量(,但是当我检查对象user.Identity.Identity.clair.clair.clair.clair.clair.clair.clair.clair.clair.clair.claims.clair.clair.clair.cl in n in acteration in acteration in acteration in acteration in acteration。另一个页面的代码范围(例如在about.aspx.cs中(,然后我发现没有声称登录用户的图像URL。
问题
是否可以使用现有的ASP.NET身份/OWIN身份验证在.NET Framework 4.5(不是ASP.NET Core(中从Google获取图像URL?如果是,那将如何得到它?
在Google身份验证后执行的代码在registerexternallogin.aspx.cs
if (!IsPostBack)
{
var manager = new UserManager();
var loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo();
if (loginInfo == null)
{
Response.Redirect("~/Account/Login");
}
var user = manager.Find(loginInfo.Login);
if (user != null)
{
IdentityHelper.SignIn(manager, user, isPersistent: false);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
}
在进行一些研究之后,我找到了如何使用标准ASP.NET Identity/Owin在WebForms ASP.NET应用中获取配置文件图像URL。
必须注意的是,成功身份验证后的Google响应已经包含配置文件图像URL,但是由于它没有从响应中提取并由ASP提取。净身份/OWIN框架代码,似乎图像URL不在那里。因此,我们要做的就是提取此图片URL并将其放入ASP.NET声称对象中。(无需特别拨打Google以获取个人资料图像URL(
您需要对Visual Studio模板发出的标准代码进行以下2个更改。
- 在 startup.auth.cs 添加自定义代码,该自定义代码在Google身份验证完成其操作并返回其响应时执行。此自定义代码在
OnAuthenticated
函数内。我们将访问配置文件图像URL,可以通过浏览context.User
对象的孩子找到,并将其添加到Google's context.Identity
。
在startup.auth.cs
var options = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "someValue1",
ClientSecret = "someValue2",
//ADD CODE AS BELOW in addition to above 2 lines
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = (context) =>
{
//following line will add a new claim for profile image url
context.Identity.AddClaim(new Claim("picUrl", ((Newtonsoft.Json.Linq.JValue)(context.User.SelectToken("image").SelectToken("url"))).Value.ToString()));
return Task.FromResult(0);
}
}
};
- 当用户使用标准代码的
IdentityHelper.SignIn
方法签名时,我们需要将Google Identity声明转移到ASP.NET身份声明中。之后,我们可以在此答案结束时在Code-Snippet中所示的任何ASPX页面的代码中访问映像URL。
in IdentityModels.cs
public static void SignIn(UserManager manager, ApplicationUser user, bool isPersistent)
{
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
//CUSTOM CODE Start
//get image url claim from Google Identity
if (authenticationManager.GetExternalLoginInfo().Login.LoginProvider == "Google")
{
var externalIdentity = authenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var picClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picUrl"));
var picUrl = picClaim.Value;
//add a claim for profile pic url to ASP.Net Identity
identity.AddClaim(new System.Security.Claims.Claim("picUrl", picUrl));
}
//CUSTOM CODE end
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent , ExpiresUtc = DateTime.UtcNow.AddMinutes(5), RedirectUri="http://www,appsprocure.com" }, identity);
}
现在,只要您想使用配置文件图像URL,只需使用如下的代码。
如何在页面的代码中使用图像URL声明
var ctx = Request.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
var pictureClaim = claims.FirstOrDefault(c => c.Type == "picUrl");
if (pictureClaim != null)
{
Response.Write(string.Format("<img src='{0}' alt='profileImageMissing' />", pictureClaim.Value));
}