3

我正在使用 AngularJS 和开箱即用的 WebApi2 令牌身份验证模板(个人用户帐户)创建一个站点。我试图让两个站点同时登录,一个在www.domain.com,另一个在sub.domain.com

目前,我在 Angular 中使用以下代码对用户进行身份验证:

 $http({
            method: 'POST',
            url: '/Token',
            data: serializedData,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        }).success(function (data, status, headers, config) {
            $window.sessionStorage.token = data.access_token;
        });

并在之后为每个请求附加授权标头:

app.factory('authInterceptor', function ($rootScope, $q, $window) {
        return {
            request: function (config) {
                config.headers = config.headers || {};
                if ($window.sessionStorage.token) {
                    $window.sessionStorage.loggedIn = true;
                    config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
                }
                return config;
            }
        };
    });

    app.config(function ($httpProvider) {
        $httpProvider.interceptors.push('authInterceptor');
    });

上面的代码允许每个站点单独登录,但是会话存储不会跨其他窗口/选项卡持续存在,因此它不会将用户登录到子域。

这篇博文中有一些关于这个问题的评论(半途而废):http ://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/

但是,实现起来似乎太复杂了(并且会产生用户被重定向的不良影响)。我希望像设置域一样简单,就像使用 cookie 一样:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                CookieDomain = ".domain.com"
            });

我开始怀疑在当前情况下是否应该在 cookie 上使用令牌身份验证...

4

1 回答 1

1

这在后续帖子中进行了解释:本地/会话存储无法跨域工作,请使用标记 cookie

.domain.com您可以从 javascript创建一个 cookie来存储令牌。Cookies、本地存储和会话存储是浏览器存储信息的方式:

...我们没有将 cookie 用作身份验证机制,而只是用作支持跨不同域存储信息的存储机制。

于 2014-02-06T11:03:43.830 回答