2015-06-27 182 views
8

我正在使用ASP.Net身份來實現外部登錄。用戶使用Google登錄後,我獲得了Google的外部訪問令牌。然後,我再撥打ObtainLocalAccessToken()進行第二次api調用,它將外部訪問令牌換成新的本地訪問令牌。驗證訪問令牌 - Asp.Net身份

ObtainLocalAccessToken()調用VerifyExternalAccessToken()通過手動進行http調用和解析user_id來驗證與提供程序的外部訪問令牌。

如何利用ASP.NET標識刪除整個方法VerifyExternalAccessToken()

我認爲這就是[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]是不是?我想裝飾ObtainLocalAccessToken()端點與屬性,並在報頭({'Authorization' : 'Bearer xxx' })發送external_access_token,它應該填充User.Identity無需手動驗證外部訪問令牌?我相信這是目的,但我無法實現它的工作。我從谷歌發送一個有效的外部訪問令牌和它得到了401

我順便說一句這條線在Startup.Auth拒絕:

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(), 
      AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }); 

另外,也可以使用「/令牌」端點爲本地交易外部訪問令牌?哪種方法是正確的?

+0

我會在這裏做一個瘋狂的猜測。但是,我從谷歌使用的每一項服務都是通過https。有可能你不能使用AllowInsecureHttp = true?由於你的錯誤是401,我敢肯定這意味着不允許調用http。 – GELR

+1

嗯,我不能使用ssl,所以我需要它使用http,就像它從我的web應用程序(但不是來自移動)。但是我的理解是否正確:在發送外部訪問令牌時[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]應該填充原則?如果是這樣,它將如何知道訪問令牌來自哪個提供者? – parliament

+1

而且401 =未經授權。 「授權已被拒絕。」 – parliament

回答

5

研究通過Taiseer Joudeh

/ExternalLogin端點實施替代OWIN認證挑戰

AngularJSLoginController使得該authService.obtainAccessToken呼叫時的外部身份驗證的用戶尚未在身份提供者發現:

 if (fragment.haslocalaccount == 'False') { 
      ... 
     } 

     else { 
      //Obtain access token and redirect to orders 
      var externalData = { provider: fragment.provider, 
         externalAccessToken: fragment.external_access_token }; 
      authService.obtainAccessToken(externalData).then(function (response) { 

       $location.path('/orders'); 

它使用VerifyExternalAccessToken反對執行反向查找谷歌Facebook的 API來獲取不記名令牌的聲明信息。

 if (provider == "Facebook") 
     { 
      var appToken = "xxxxxx"; 
      verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken); 
     } 
     else if (provider == "Google") 
     { 
      verifyTokenEndPoint = string.Format("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={0}", accessToken); 
     } 
     else 
     { 
      return null; 
     } 

如果發現令牌,它返回一個新ASP.NET承載令牌

 var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName); 

     return Ok(accessTokenResponse); 

隨着[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]OWIN中間件使用外部承載令牌到訪問第三方Cookie並註冊新帳戶(或查找現有的帳戶)。

OWIN中間件不能被配置爲接受外部承載令牌代替地方當局令牌。 外部承載令牌僅用於認證和註冊。

+1

嗨戴夫,有沒有其他解決方案或方法內置到OWIN中間件或以其他方式可以調用來驗證外部提供程序令牌? 'VerifyExternalAccessToken()'的自定義邏輯感覺很難/重新發明輪子,因爲每當我想添加一個新的外部提供者時,該方法都需要更新。例如。推特。謝謝! – GFoley83

+0

確實,@ GFoley83,'VerifyExternalAccessToken()'是一個破解。 OWIN確實已經出現了使用OAuth cookie的方法。但是沒有一個用於消費認證*令牌*。要在OAuth持票人Token背後獲得ID,您將受到提供商的支配。 –