我正在尝试在预先存在的Angularjs应用程序中使用Azure AD v1.0.14,该应用程序使用ui.router来管理状态更改。好消息是我可以成功登录和注销,但坏消息是我的应用程序在管理状态更改时遇到问题。在将Azure AD模块集成到代码中之前,这些状态更改有效。
function ($stateProvider, $urlRouterProvider, adalProvider) {
$urlRouterProvider.rule(function ($injector, $location) {
console.log("Requested URL path=" + $location.$$path);
});
$urlRouterProvider.when('/home', '/home/app');
$urlRouterProvider.when('/app', '/home/app');
$urlRouterProvider.otherwise(function ($injector, $location) {
console.log('$urlRouterProvider.otherwise redirecting to ' + $location.$$path);
var $state = $injector.get("$state");
$state.go("login");
});
$stateProvider
.state("login", ...)
.state("home", {
abstract: true,
url: '/home',
requireADLogin: false,
templateUrl: 'home.html'
})
.state("app", {
url: '/app',
requireADLogin: false,
templateUrl: 'app.html',
controller: 'app'
})
.state("more", ...)
}
最初,条目成功进入登录状态/控制器(我登录/注销),但尝试$ state.go(' app')或手动URL条目进入' http://baseurl/#/home/app'自动重定向回“登录”#39;通过.otherwise规则,看来这是由Azure AD根据下面的日志输出完成的。
Wed, 01 Mar 2017 22:56:38 GMT:1.0.14-VERBOSE: Location change event from http://localhost:3000/#/login to http://localhost:3000/#/home @state.js:12
Requested URL path=/home @app.js:14
Wed, 01 Mar 2017 22:56:38 GMT:1.0.14-VERBOSE: Location change event from http://localhost:3000/#/home to http://localhost:3000/#/home/app @state.js:12
Requested URL path=/home/app @state.js:19
$urlRouterProvider.otherwise redirecting to /home/app @app.js:14
Wed, 01 Mar 2017 22:56:38 GMT:1.0.14-VERBOSE: Location change event from http://localhost:3000/#/home/app to http://localhost:3000/#/login @state.js:12
Requested URL path=/login @state.js:12
我的问题是为什么Azure AD会重定向回登录? Azure AD无法处理抽象/嵌套状态吗?有没有解决这个问题,因为我们的家乡是必不可少的。
答案 0 :(得分:0)
由于哈希“#”之后的网址格式是客户端,服务器将不会处理这些部分,并且在重定向网址中将忽略这些部分,您可以尝试在angularjs中使用html5
模式:
// using '!' as the hashPrefix but can be a character of your choosing
app.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true).hashPrefix('!');
}]);
Azure AD无法处理抽象/嵌套状态吗?
您可以在adal中为js的配置添加anonymousEndpoints
,例如:
adalAuthenticationServiceProvider.init({
tenant: TENANT_ID,
clientId: CLIENT_ID,
anonymousEndpoints: ['public/'] //will not authorize for public pattern
},
您可以在https://github.com/AzureAD/azure-activedirectory-library-for-js#getting-started的6点找到更多信息。