2017-05-07 302 views
13

现在,我试图在我的ASP.net核心Web API项目中使用Google和Facebook进行OAuth身份验证。ASP.net核心Web API:使用Facebook/Google OAuth访问令牌进行身份验证

我目前的状态是:

  • 我已经在用户需要的ASP.net核心Web API项目进行认证
  • 我应该用我的网角2的Web应用程序API(身份验证)
  • 我有一个Android应用程序,它应该用我的网络API(身份验证)

我的目标是:

  • 使用谷歌/ Facebook的OAuth的提供商进行登录
  • 后:将自己的用户帐户(可能与IdentityServer4)
  • 没有必要重定向到一个特殊的登录网站(如IdentityServer4解)。只需点击应用中的脸书/谷歌按钮,即可访问,完成!

在我的android和角度的应用程序,我能够从谷歌/脸书检索访问令牌。现在,我想使用OAuth隐式流程来验证用户在我的web api上的给定访问令牌(将令牌放入标头中作为不记名令牌)

有我的问题:是否有任何genric方式轻松做到这一点?我不希望为此使用Facebook /谷歌SDK。

我曾尝试以下操作:

  • 使用IdentityServer4:有了这个我能够与Facebook登录/谷歌在我的WebAPI,但需要重定向到IdentityServer4登录页面。是否有任何可能的方法,只是在我的应用程序中打入google/fb-Button并登录,而不重定向到identityServer登录页面?
  • 使用谷歌/脸书认证中间件https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/):但他们没有验证我发送的持票人令牌(试过无数的方式来实现适当的验证)。这甚至有可能在web api中使用吗?
  • 尝试使用Microsoft.AspNetCore.Authentication.JwtBearer的中间件,并通过自己投入了谷歌/ Facebook的必要的选项,也没有验证(藏汉无数次)

在过去的几天里,我尝试了很多可能的解决方案,以至于我完全陷入困境,失去了为实现这一目标需要做的事情。在这一点上,我已经阅读了几乎每个asp.net web api oauth tutorial/stackoverflow条目,但无法弄清楚如何在我的情况下使用它,因为我想要的。大多数教程仅适用于mvc网站或使用IdentityServer4重定向到其登录页面。

任何建议或解决方案?我错过了什么?

+1

对于第三方认证,我相信当页面重定向回你的应用程序(用户进行身份验证),HTTP请求应包含认证数据。你可以编写一个全局过滤器来拦截它。在这里查看一些细节:https://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ – wannadream

+0

你有没有解决这个问题? – Marcus

+1

我发现了一个解决方案(几个星期前,忘记在这里更新): 在IdentityServer4的身份验证端点上,可以使用特殊参数立即重定向到所选身份提供商的网站,而无需通过身份服务器的登录页面。如此处所述http://docs.identityserver.io/en/release/endpoints/authorize.html acr_values中的idp:name_of_idp参数会直接重定向到身份提供程序,这正是我想要的。 – Rul3r

回答

10

如果我正确地沉没了,您已经通过您的应用程序从Facebook SDK获得了Facebook用户令牌。
像你一样,我无法找到如何使用ASP.NET核心库/软件包。所以我回到基础。
我只是用Facebook令牌调用我的api的端点,在Facebook图表api中检查它,如果没问题,我就注册用户(如果需要),并返回我的JWT令牌,就好像用户通过古典用户名/密码路径。

[HttpPost] 
[AllowAnonymous] 
[Route("api/authentication/FacebookLogin")] 
public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken) 
{ 
    //check token 
    var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") }; 
    var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture"); 
    if (!response.IsSuccessStatusCode) return BadRequest(); 
    var result = await response.Content.ReadAsStringAsync(); 
    var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result); 

    //register if required 
    var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id); 
    if (facebookUser == null) 
    { 
     var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email}; 
     var result2 = await _userManager.CreateAsync(user); 
     if (!result2.Succeeded) return BadRequest(); 
     facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id}; 
     _context.FacebookUsers.Add(facebookUser); 
     _context.SaveChanges(); 
    } 

    //send bearer token 
    return Ok(GetToken(facebookUser.UserId)); 
} 
相关问题