Ответ 1
Использовать ли аутентификацию cookie или (предъявитель) токены все еще зависит от типа приложения, которое у вас есть. И насколько я знаю, пока нет лучшей практики. Но поскольку вы работаете в SPA и уже используете JWT-библиотеку, я бы предпочел использовать подход, основанный на токенах.
К сожалению, я не могу помочь вам с ASP.NET, но обычно библиотеки JWT генерируют и проверяют токен для вас. Все, что вам нужно сделать, это вызвать generate
или encode
учетные данные (и секрет) и verify
или decode
на токене, отправленном с каждым запросом. И вам не нужно сохранять какое-либо состояние на сервере и не нужно отправлять cookie, что вы, вероятно, сделали с FormsAuthentication.SetAuthCookie(user.UserName, false)
.
Я уверен, что в вашей библиотеке приведен пример использования меток генерации/кодирования и проверки/декодирования.
Таким образом, создание и проверка не является чем-то, что вы делаете на стороне клиента.
Поток выглядит примерно так:
- Клиент отправляет пользователю учетные данные для входа на сервер.
- Сервер аутентифицирует учетные данные и отвечает сгенерированным токеном.
- Клиент хранит токен где-то (локальное хранилище, файлы cookie или просто в памяти).
- Клиент отправляет токен в качестве заголовка авторизации для каждого запроса на сервер.
- Сервер проверяет токен и соответственно выполняет либо отправку запрошенного ресурса, либо 401 (или что-то подобное).
Шаг 1 и 3:
app.controller('UserController', function ($http, $window, $location) {
$scope.signin = function(user) {
$http.post(uri + 'account/signin', user)
.success(function (data) {
// Stores the token until the user closes the browser window.
$window.sessionStorage.setItem('token', data.token);
$location.path('/');
})
.error(function () {
$window.sessionStorage.removeItem('token');
// TODO: Show something like "Username or password invalid."
});
};
});
sessionStorage
сохраняет данные до тех пор, пока пользователь открывает страницу. В случае, если вы хотите самостоятельно обрабатывать время истечения срока действия, вместо этого вы можете использовать localStorage
. Интерфейс тот же.
Шаг 4:
Чтобы отправить токен при каждом запросе на сервер, вы можете использовать то, что Angular вызывает Interceptor. Все, что вам нужно сделать, это получить ранее сохраненный токен (если есть) и прикрепить его как заголовок ко всем исходящим запросам:
app.factory('AuthInterceptor', function ($window, $q) {
return {
request: function(config) {
config.headers = config.headers || {};
if ($window.sessionStorage.getItem('token')) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.getItem('token');
}
return config || $q.when(config);
},
response: function(response) {
if (response.status === 401) {
// TODO: Redirect user to login page.
}
return response || $q.when(response);
}
};
});
// Register the previously created AuthInterceptor.
app.config(function ($httpProvider) {
$httpProvider.interceptors.push('AuthInterceptor');
});
И обязательно используйте SSL!