Skip to content

Commit d64e231

Browse files
committed
Initial cookie refresh
1 parent 41588a8 commit d64e231

5 files changed

Lines changed: 139 additions & 63 deletions

File tree

src/IdentityManager2/Api/Controllers/PageController.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,21 @@ public async Task<IActionResult> Login()
5252
return Challenge(new AuthenticationProperties {RedirectUri = Url.Action("Login")}, config.SecurityConfiguration.HostChallengeType);
5353
}
5454

55+
[HttpGet]
56+
[AllowAnonymous]
57+
[Route("api/login/refresh")]
58+
public async Task<IActionResult> Refresh()
59+
{
60+
var authResult = await HttpContext.AuthenticateAsync(config.SecurityConfiguration.HostAuthenticationType);
61+
if (authResult.Succeeded)
62+
{
63+
await HttpContext.SignInAsync(IdentityManagerConstants.LocalApiScheme, authResult.Principal);
64+
return Ok();
65+
}
66+
67+
return Unauthorized();
68+
}
69+
5570
[HttpGet]
5671
[AllowAnonymous]
5772
[Route("api/logout", Name = IdentityManagerConstants.RouteNames.Logout)]

src/IdentityManager2/Assets/Scripts/App/ttIdm.js

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,62 @@
22

33
(function (angular) {
44
const app = angular.module("ttIdm", []);
5-
5+
66
function config($httpProvider) {
7-
function intercept($q, idmErrorService) {
7+
function intercept($q, $injector, idmErrorService, PathBase, $rootScope) {
8+
var inprogressRefreshRequest = null;
9+
810
return {
9-
'request': function (config) {
11+
'request': function(config) {
1012
idmErrorService.clear();
1113
return config;
1214
},
13-
'responseError': function (response) {
14-
/*if (response.status === 401) {
15+
'responseError': function(response) {
16+
if (response.config.url === PathBase + "/api/login/refresh") {
17+
return $q.reject(response);
18+
}
1519

16-
}*/
17-
return $q.reject(response);
20+
switch (response.status) {
21+
case 401:
22+
var deferred = $q.defer();
23+
24+
if (!inprogressRefreshRequest) {
25+
inprogressRefreshRequest = $injector.get("$http").get(PathBase + "/api/login/refresh");
26+
}
27+
28+
inprogressRefreshRequest.then(
29+
function() {
30+
inprogressRefreshRequest = null;
31+
32+
$injector.get("$http")(response.config).then(
33+
function(retryResponse) {
34+
deferred.resolve(retryResponse);
35+
},
36+
function(retryResponse) {
37+
deferred.reject(retryResponse);
38+
});
39+
},
40+
function () {
41+
inprogressRefreshRequest = null;
42+
response.data = { message: "Session has expired" };
43+
44+
$rootScope.layout.username = null;
45+
$rootScope.layout.links = null;
46+
$rootScope.showLogin = true;
47+
$rootScope.showLogout = false;
48+
49+
return deferred.reject(response);
50+
});
51+
52+
return deferred.promise;
53+
default:
54+
return $q.reject(response);
55+
}
1856
}
1957
};
2058
}
2159

22-
intercept.$inject = ["$q", "idmErrorService"];
60+
intercept.$inject = ["$q", "$injector", "idmErrorService", "PathBase", "$rootScope"];
2361
$httpProvider.interceptors.push(intercept);
2462
}
2563
config.$inject = ["$httpProvider"];
@@ -59,18 +97,19 @@
5997
return d.promise;
6098
}
6199

62-
return $http.get(PathBase + "/api").then(function (resp) {
63-
cache = resp.data;
64-
return cache;
65-
}, function (resp) {
66-
cache = null;
67-
if (resp.status === 401) {
68-
throw "You are not authorized to use this service.";
69-
}
70-
else {
71-
throw resp.data && (resp.data.exceptionMessage || resp.data.message) || "Failed to access IdentityManager API.";
72-
}
73-
});
100+
return $http.get(PathBase + "/api").then(function(resp) {
101+
cache = resp.data;
102+
return cache;
103+
},
104+
function(resp) {
105+
cache = null;
106+
if (resp.status === 403) {
107+
throw "You are not authorized to use this service.";
108+
} else {
109+
throw resp.data && (resp.data.exceptionMessage || resp.data.message) ||
110+
"Failed to access IdentityManager API.";
111+
}
112+
});
74113
}
75114
};
76115
}
@@ -88,7 +127,7 @@
88127

89128
function errorHandler(msg) {
90129
msg = msg || "Unexpected Error";
91-
return function(response) {
130+
return function (response) {
92131
if (response.data.exceptionMessage) {
93132
$log.error(response.data.exceptionMessage);
94133
}

src/IdentityManager2/Assets/Scripts/App/ttIdmApp.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
function config(PathBase, $routeProvider) {
77
$routeProvider
88
.when("/", {
9-
controller: "HomeCtrl",
109
templateUrl: PathBase + "/assets/Templates.home.html"
1110
})
1211
.when("/error", {
@@ -24,6 +23,8 @@
2423
$rootScope.layout = {};
2524

2625
function removed() {
26+
27+
2728
idmErrorService.clear();
2829
$rootScope.layout.username = null;
2930
$rootScope.layout.links = null;
@@ -60,13 +61,4 @@
6061
}
6162
LayoutCtrl.$inject = ["$rootScope", "PathBase", "idmApi", "$location", "$window", "idmErrorService", "ShowLoginButton"];
6263
app.controller("LayoutCtrl", LayoutCtrl);
63-
64-
function HomeCtrl(ShowLoginButton, $routeParams) {
65-
if (ShowLoginButton === false) { // TODO: Cleanup
66-
}
67-
};
68-
69-
HomeCtrl.$inject = ["ShowLoginButton", "$routeParams"];
70-
app.controller("HomeCtrl", HomeCtrl);
71-
7264
})(angular);

src/IdentityManager2/Assets/Scripts/Bundle.js

Lines changed: 62 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/IdentityManager2/IdentityManager2.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
<FrameworkReference Include="Microsoft.AspNetCore.App" />
4040
<PackageReference Include="AutoMapper" Version="9.0.0" />
4141
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.0" />
42-
<PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
4342
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.0" />
4443
</ItemGroup>
4544

0 commit comments

Comments
 (0)