2016-06-06 36 views
0
  1. 創建自定義提供程序,實現:OAuthProvider,IAuthWithRequest。ServiceStack:如何使用自定義OAuthProvider訪問Azure資源

  2. 創建了調用提供者的PreAuthenticate()方法的AuthenticateAttribute。

  3. 配置的CorsFeature:

    Plugins.Add(new CorsFeature(new[] { "http://localhost:23589", "*" }, 
         allowCredentials: true, 
         allowedHeaders: "Content-Type, Allow, Authorization")); 
    

問題:當提供者的身份驗證方法被調用來從 請求代碼 「login.microsoftonline.com」(authService.Redirect(PreAuthUrlFilter(this, codeRequest));)以下錯誤被拋出:

XMLHttpRequest無法加載https://login.microsoftonline.com/d331431b-899c-4666-8094-e82e6bfc3964/oaut ... orts%2fpbi & scope = user_impersonation & state = f8e986304a47427d8c6a76767f2ef573。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此,'http://localhost:23589'不允許訪問。

什麼是正確的方式:

  1. 請求從微軟
  2. 的授權碼
  3. 獲取代碼後面的查詢字符串
  4. 請求驗證令牌使用的代碼

授權碼授權流程圖

回答

1

Ha看看ServiceStack.Authentication.Aad。至少應該提供經過單元測試的參考實現。或者你也可以直接使用NuGet包。

我鼓勵您克隆存儲庫,您可以在其中單步執行獨立SelfHostTest以及單元測試。

據我所知,CORS不應該是必需的。我可能是錯的。但在我的實現中,來自Microsoft的JSON響應是由服務器處理的,而不是Web瀏覽器。

對於在此回覆中未包含代碼示例,我很抱歉;從該存儲庫中取出單個代碼段將很困難。整個存儲庫是您的根本問題的答案。

完全披露:我是該插件的作者,併爲其使用獲得虛擬互聯網點。

+0

謝謝雅各布。我正在使用你的實現。它很好,直到我嘗試將它集成到我的應用程序:)。當我調用RequestCode然後返回時(RequestCode(authService,session,userSession,tokens);),拋出錯誤。如果我再次調用Authenticate,則代碼爲空。無法弄清楚我錯過了什麼。如何「等待」,獲取代碼,然後請求令牌。 –

+0

問題如下:1.客戶端調用需要訪問Azure的服務。 2.服務調用AAD AuthenticationProvider。 3. AuthenticationProvider請求一個代碼並返回。 4.服務退貨。 5. Microsoft將查詢字符串中的代碼發送出去,但AuthenticationProvider無法獲取它並繼續處理該流程。 –

+0

Jacob,你是否嘗試添加客戶端? –