Фон
Я использую эти технологии для защиты приложения WebApi:
- ThinkTecture.IdentityServer3
- ОВИН (Azure)
- Одностраничное приложение - клиент javascript
- См. образец простого пошагового руководства по OAuth2 (github). )
В приведенном выше примере клиент консольного приложения .NET запрашивает маркер у IdentityServer и использует его для доступа к приложению WebApi. Это отлично работает в образце.
Я хочу изменить клиент консольного приложения .NET на клиент одностраничного приложения javascript. Я попытался добавить прокси-контроллер входа в систему, который выполняет запрос к IdentityServer от имени клиента javascript и возвращает токен обратно клиенту в файле cookie.
Код
[HttpPost]
[Route("login")]
public HttpResponseMessage Login(LoginRequest request) // Proxy to IdentityServer3
{
var tokenClient = new TokenClient(
"https://localhost:44333/connect/token",
"javascript client",
"client secret");
var tokenResponse = _tokenClient.RequestResourceOwnerPasswordAsync(request.username, request.password, "api1").Result;
var cookie = new CookieHeaderValue("access_token", tokenResponse.AccessToken);
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = "localhost";
cookie.Path = "/";
var response = new HttpResponseMessage();
response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return response;
}
Я успешно получаю токен доступа в клиенте javascript, однако API не распознает его.
Вопрос
Как мне передать токен, сгенерированный IdentityServer, в приложение javascript и как его использовать для доступа к WebApi?