使用Google身份验证时,ASP.NET 4.5 WebForms中的图像URL



我在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个更改。

  1. 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);
         }
       }
    };
  1. 当用户使用标准代码的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));
}

相关内容

  • 没有找到相关文章