我正在使用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清除返回的令牌。
你能帮我弄清楚,我该如何以及在哪里真正使用它?
答案 0 :(得分:1)
这是一种通用解决方案,我会删除ASP.NET SPA的东西。也许使用Knockout,ASP.NET SPA模板提供了一些价值,但Angular可以完成您尝试做的所有操作而无需与服务器端模板作斗争。
理想情况下,您的Angular应用程序将被视为后端服务的任何其他客户端(Android或iOS)。您的后端API可以公开您需要的所有功能,包括身份验证 - 没有理由将您的用户从Angular应用程序中移出来进行身份验证。
如果您想要引导您的应用程序,ASP.NET SPA的替代方法是使用Yeoman generator。试试Angular Fullstack generator,它可以很好地演示如何在Angular应用程序中验证用户身份。