0

我正在构建一个 Ember 应用程序,我必须与SimpleSAMLPHP集成以处理针对多个身份提供者 (IdP) 的身份验证。概括地说,身份验证流程如下:

  • 用户导航到 Ember 应用程序
  • 用户未通过身份验证(通过 SimpleAuth)并看到视图 A。
  • 用户单击“登录”并被定向到 SimpleSAMLPHP,它位于 Ember 应用程序之外。
  • 用户输入凭据并针对任何 IdP 进行身份验证并返回给 Ember 应用程序。

问题出在此返回 Ember 应用程序上。Ember 将加载视图 A(未经身份验证的视图),因为 Ember SimpleAuth 尚未到达其sessionAuthenticationSucceeded回调。此后不久就到达该回调,我可以将经过身份验证的视图 B 呈现到插座中。问题是用户在看到视图 B 之前看到了视图 A 的闪现。

  • 我可以通过 AJAX 发布到 SimpleSAMLPHP 而无需离开 Ember 应用程序吗?我假设这会破坏这一点,产生安全问题等。
  • 或者有没有办法让 Ember 呈现不同的渲染,直到达到 sessionAuthenticationSucceeded 回调?
  • 我想我也可以使用一些技巧,让视图 A 始终是一个微调器或其他东西,然后在准备好时渲染一个新视图。我认为这可能只会导致其他问题,因为 sessionAuthenticationSucceeded 仅在身份验证后立即执行。

我要么错过了一些简单的东西,要么就是没有真正的好方法来做到这一点。我愿意接受任何建议,在此先感谢。

4

2 回答 2

0

我最终做的基本上是在我的 Ember 应用程序的“索引”路由上没有任何视图逻辑,而是创建了一个新路由,我在登录后将用户重定向到该路由。我还添加了 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,登录并重定向回来,Ember 重定向到新路由。如果他们刷新页面,我们会看到他们在 beforeModel 中有一个会话,并且也重定向到新路由。现在用户没有屏幕闪烁了。

于 2015-02-06T02:44:57.953 回答
0

不,您不能通过 AJAX 发布到 simpleSAMLPHP。SAML / SSO 的工作方式是将用户定向到 ADFS 门户,然后用户登录,生成并验证令牌,然后将用户发送回端点 URL。SSO 和 SAML 的价值在于它为开发人员留下了零责任。我已经并且确实将 SIMPLESAML / SSO 合并到应用程序中,并且用户针对 Active Directory 服务器进行身份验证,然后与 SSO 属性一起被引导回 SSO 应用程序。通常可以传递的唯一属性是 USERNAME、FIRST NAME、LAST NAME、PHONE、EMAIL 等... SSO 的目的是您在 ONE PLACE 登录,然后传递到您尝试访问的任何站点。我们为学术界的所有 PHP 企业级应用程序执行此操作。

于 2015-02-05T19:33:20.697 回答