Авторизуйтесь в веб-приложении с токеном доступа через веб-интерфейс
У меня есть веб-интерфейс API, подключенный к базе данных, который предоставляет токены доступа с использованием OpenIddict и поток паролей (Предоставление учетных данных пароля владельца ресурса):
services.AddOpenIddict<TestUser, IdentityRole<Guid>, CompleteContext, Guid>()
.EnableTokenEndpoint("/connect/token")
.AllowPasswordFlow()
.AllowRefreshTokenFlow()
.DisableHttpsRequirement()
.AddEphemeralSigningKey();
Веб-API имеет защищенные действия, которые могут быть вызваны только с действительным токеном доступа. Это работает нормально.
У меня есть веб-приложение, которое должно использовать те же токены доступа для авторизации. Пользователь вводит свои учетные данные, а веб-приложение отправляет их в API для получения токена доступа. Я думал, что веб-приложение может использовать этот токен доступа для авторизации, но я сейчас не знаю, как настроить промежуточное ПО в ядре asp.net.
Предыстория: веб-приложение и веб-API должны работать на разных серверах, и позже я хочу создать мобильные приложения, которые используют веб-API для доступа к данным. Вот почему я хочу использовать токены. Я хочу, чтобы веб-API был единственным проектом с доступом к базе данных.
Изменить фон: веб-приложение представляет собой приложение mvc 6 со стандартными пользовательскими функциями: регистрация, вход в систему, выход из системы, подтверждение по электронной почте и некоторые взаимодействия с пользовательским контентом. Весь этот контент должен храниться в базе данных. Поскольку позже мне может понадобиться добавить мобильное приложение, я хочу иметь отдельный веб-интерфейс для хранения и доступа к данным в базе данных. Единственной целью веб-API является обработка доступа к данным. Веб-приложение mvc должно взаимодействовать с веб-интерфейсом API для получения и хранения данных. Пользователь должен пройти аутентификацию для использования веб-приложения, а веб-приложение должно быть аутентифицировано для доступа к веб-API. Сторонних приложений нет, что заставило меня задуматься о потоке паролей. Я полагаю, что пользователь вводит свои учетные данные в веб-приложение, чтобы получить токен доступа из веб-API. Мой план состоит в том, чтобы токен доступа был сохранен в файле cookie, чтобы веб-приложение могло использовать его для доступа к веб-API, если это необходимо. Могу ли я использовать этот токен доступа для аутентификации и авторизации в веб-приложении? Может быть, что-то вроде создания кастома SignInManager
а также UserManager
или предоставьте доступ к базе данных веб-приложения и используйте стандартную идентификацию asp.net. Или есть другое лучшее решение?
1 ответ
Я думал, что веб-приложение может использовать этот токен доступа для авторизации, но я сейчас не знаю, как настроить промежуточное ПО в ядре asp.net.
В ASP.NET Core нет ничего, что помогло бы вам реализовать клиент "Предоставление пароля для владельца ресурса". К счастью, это то, что вы можете легко сделать сами HttpClient
, Вот как вы можете это сделать (обратите внимание, что обработка ошибок оставлена в качестве упражнения):
public async Task<IActionResult> SignIn(string username, string password)
{
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
{
return View("MissingCredentials");
}
var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/connect/token");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
["client_id"] = "your client_id",
["client_secret"] = "your client_secret",
["grant_type"] = "password",
["username"] = "username",
["password"] = "password"
});
var response = await client.SendAsync(request, notification.Request.CallCancelled);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
var token = payload.Value<string>("access_token");
if (string.IsNullOrEmpty(token))
{
return View("InvalidCredentials");
}
var identity = new ClaimsIdentity("Cookies");
identity.AddClaim(new Claim("access_token", token));
return SignIn(new ClaimsPrincipal(identity), "Cookies");
}
В качестве альтернативы вы можете рассмотреть возможность использования интерактивного потока, такого как код авторизации, который позволит вам использовать клиентское промежуточное ПО OpenID Connect, разработанное командой ASP.NET. Вы можете попробовать этот образец OpenIddict MVC, чтобы понять, как он работает.