使用 OWIN 在 ASP.NET MVC 5 应用程序中存储和检索 facebook 访问令牌

Posted

技术标签:

【中文标题】使用 OWIN 在 ASP.NET MVC 5 应用程序中存储和检索 facebook 访问令牌【英文标题】:Store and retrieve facebook access token in ASP.NET MVC 5 app using OWIN 【发布时间】:2017-01-10 16:56:08 【问题描述】:

我是 OWIN 的新手。目前我正在使用 Visual Studio 2015 创建 ASP.NET MVC 项目,Visual Studio 向导处理几乎基本功能,如注册新用户、使用外部帐户登录...... 在 Startup.Auth.cs 中,我使用 facebook 功能实现了登录,如下所示:

var option = new FacebookAuthenticationOptions
        
            AppId = appId,
            AppSecret = appSecret,
            Provider = new FacebookAuthenticationProvider()
            
                OnAuthenticated = (ctx) =>
                
                    ctx.Identity.AddClaim(new System.Security.Claims.Claim("fb_access_token", ctx.AccessToken, ClaimValueTypes.String, "Facebook"));
                    return Task.FromResult(0);
                
            ,
            AuthenticationType = DefaultAuthenticationTypes.ExternalCookie
        ;
        app.UseFacebookAuthentication(option);

在 AccountController.cs 中我想获取访问令牌以获取一些用户的信息,但我总是收到声明对象的空引用异常:

public ActionResult Test()

    ClaimsIdentity claimIdenties = HttpContext.User.Identity as ClaimsIdentity;
    var claim = claimIdenties.FindFirst("fb_access_token");
    return View(claim.Value);

你们能建议我任何解决方案吗?

对不起,我英语不好

【问题讨论】:

【参考方案1】:

在使用 facebook 注册期间..让我们将访问令牌存储在我们的数据库中以便稍后检索它们..so 在您的帐户控制器中

  var claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
            if (claimsIdentity != null)
            
                // Retrieve the existing claims for the user and add the FacebookAccessTokenClaim
                var currentClaims = await UserManager.GetClaimsAsync(user.Id);
                var facebookAccessToken = claimsIdentity.FindAll("FacebookAccessToken").First();
                if (currentClaims.Count() <= 0)
                
                    await UserManager.AddClaimAsync(user.Id, facebookAccessToken);
                

现在你可以获取访问令牌来获取类似这样的一些数据

 var fb = new FacebookClient(loginInfo.ExternalIdentity.Claims.FirstOrDefault(x => x.Type == "FacebookAccessToken").Value);
                    dynamic userfbData = fb.Get("/me?fields=email,name");
                    picurl = String.Format("https://graph.facebook.com/0/picture?type=large", userfbData.id);
                    dispname = userfbData.name;

这对我很有效

【讨论】:

以上是关于使用 OWIN 在 ASP.NET MVC 5 应用程序中存储和检索 facebook 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 5 SPA 模板 OWin /token 导致“invalid_client”

如何在 OWIN ASP.NET MVC5 中注销用户

ASP.NET MVC5 OWIN Facebook 身份验证突然不起作用

MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

ASP.NET MVC 5 中的基本身份验证

在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序