AngularJS从带有哈希的url读取参数

时间:2015-06-06 23:06:34

标签: asp.net angularjs single-page-application asp.net-spa

我正在使用ASP.NET SPA模板,但重新设置它以使用AngularJS而不是KnockoutJS。我遇到麻烦的是授权访问令牌。默认情况下,在此模板中,通过将用户重定向到/Account/Authorize?client_id=web&response_type=token来检索授权访问令牌,之后,用户将/#access_token=TOKEN_HERE&token_type=bearer&expires_in=1209600重定向到home作为参数。在KO模板中,有一个common对象,函数getFragment读取此url参数,并返回此访问令牌。在模板中,有这个代码,每次重新加载页面时执行

        if (!dataModel.getAccessToken()) {
            // The following code looks for a fragment in the URL to get the access token which will be
            // used to call the protected Web API resource
            var fragment = common.getFragment();

            if (fragment.access_token) {
                // returning with access token, restore old hash, or at least hide token
                window.location.hash = fragment.state || '';
                dataModel.setAccessToken(fragment.access_token);
            } else {
                // no token - so bounce to Authorize endpoint in AccountController to sign in or register
                window.location = "/Account/Authorize?client_id=web&response_type=token&state=" + encodeURIComponent(window.location.hash);
            }
        }

dataModel.get/setAccessToken将令牌存储为LocalStorage中的变量。 我试图将这段代码插入AngularJS控制器,重定向用户,如果localstorage中没有访问令牌。但是,如果我使用ngRoute,它会因为回应而混乱。它将URL更改为默认路由,在app.Config中设置,并在我读取之前从URL清除返回的令牌。

你能帮我弄清楚,我该如何以及在哪里真正使用它?

1 个答案:

答案 0 :(得分:1)

这是一种通用解决方案,我会删除ASP.NET SPA的东西。也许使用Knockout,ASP.NET SPA模板提供了一些价值,但Angular可以完成您尝试做的所有操作而无需与服务器端模板作斗争。

理想情况下,您的Angular应用程序将被视为后端服务的任何其他客户端(Android或iOS)。您的后端API可以公开您需要的所有功能,包括身份验证 - 没有理由将您的用户从Angular应用程序中移出来进行身份验证。

如果您想要引导您的应用程序,ASP.NET SPA的替代方法是使用Yeoman generator。试试Angular Fullstack generator,它可以很好地演示如何在Angular应用程序中验证用户身份。