2015-02-05 49 views
0

我正在構建一個Ember應用程序,我必須與SimpleSAMLPHP集成以處理針對多個身份提供者(IdP)的身份驗證。在高層次上,認證流程如下:Ember SimpleAuth&SimpleSAMLPHP Screen Flash

  • 用戶導航到灰燼應用
  • 用戶沒有被認證(通過SimpleAuth),並認爲視圖A.
  • 用戶點擊「登錄」,是指向了Ember應用程序之外的SimpleSAMLPHP。
  • 用戶輸入憑證,並對任何IdP進行身份驗證並返回到Ember應用程序。

這是回到Ember應用程序這就是問題。 Ember將加載視圖A(未認證的視圖),因爲Ember SimpleAuth尚未到達其回調函數sessionAuthenticationSucceeded。該回調在此後不久就可以實現,並且我可以將經過驗證的視圖B呈現給出口。問題是用戶在看到視圖之前看到閃爍的視圖B.

  • 我可以通過AJAX發佈到SimpleSAMLPHP而無需離開Ember應用程序嗎?我假設會打敗點,創建安全問題等。
  • 或者有沒有一種方法讓Ember在呈現sessionAuthenticationSucceeded回調之前有不同的呈現?
  • 我想我也可以使用一些技巧,並有視圖A總是一個微調或什麼,然後準備好時呈現一個新的視圖。我認爲這可能會導致其他問題,因爲sessionAuthenticationSucceeded只是在驗證後立即執行。

我要麼缺少一些簡單的東西,要麼沒有真正做到這一點的好方法。我願意提供任何建議,請提前致謝。

回答

0

我最終做的是在我的Ember應用程序的「index」路徑上基本上沒有任何視圖邏輯,而是創建一個新的路由,我在登錄後將用戶重定向到該路由。我還添加了AuthenticatedRouteMixin我可以使用beforeModel掛鉤轉換。它的要點是:

App.ApplicationRoute = Ember.Route.extend(
    SimpleAuth.AuthenticatedRouteMixin, 
    SimpleAuth.ApplicationRouteMixin, 
    { 

    beforeModel: function (transition) { 
     var session = this.get('session'); 

     if (!Ember.isEmpty(session)) { 
      this.transitionTo('new route'); 
     } else { 
      this._super(transition); 
     } 
    }, 

    model: function (params) { 
     // ... 
    }, 

    renderTemplate: function() { 
     // ... 
    }, 

    actions: { 

     sessionAuthenticationSucceeded: function() { 
      this.renderTemplate(); 
      this.transitionTo('new route'); 
     }, 

     authenticateSession: function() { 
      // ... 
     }, 

     invalidateSession: function() { 
      // ... 
     } 
    } 
}); 

有效地將用戶重定向到SimpleSAMLPHP,在和重定向回日誌,灰燼重定向到新的路由。如果他們刷新頁面,我們看到他們在beforeModel中有一個會話,並重定向到新的路由。現在用戶沒有屏幕閃光。

+0

我也看看Torii - 我認爲它是用來解決像這樣的問題 – iwayneo 2015-02-11 09:57:40

+0

我不認爲Torii有SAML支持。你可以使用iFrame或其他方法破解你的方式,但我不會推薦這種方法。 – Garrett 2017-03-13 18:51:29

0

不,您不能通過AJAX POST到simpleSAMLPHP。 SAML/SSO的工作方式是將用戶指向ADFS門戶,然後用戶簽入,令牌生成並驗證,然後用戶發送回終點URL。 SSO和SAML的價值在於它爲開發者留下了ZERO的責任。我已經並且確實將SIMPLESAML/SSO合併到應用程序中,並且用戶通過Active Directory服務器進行身份驗證,然後將其定向回SSO應用程序以及SSO ATTRIBUTES。通常可以傳遞的唯一屬性是USERNAME,FIRST NAME,LAST NAME,PHONE,EMAIL等...... SSO的目的是您在ONE PLACE上登錄,然後傳遞到您嘗試訪問的任何站點。我們在Academia爲我們所有的PHP企業級應用程序執行此操作。