Как я могу использовать вход на веб-сайт ASP.NET Identity с моим Android-приложением?
У меня есть веб-приложение ASP.NET Core. Пользователи могут войти, он использует Identity.
Сейчас я создаю приложение для Android с Xamarin, которое предоставит очень уменьшенную часть сайта - добавление / удаление товаров из инвентаря.
Это действие входа в систему:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync (model.Email, model.Password, model.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
var user = await UserManager.FindByNameAsync( model.Email );
if ( !user.IsApproved ) {
await _signInManager.SignOutAsync();
_logger.LogWarning(2, "User account not approved.");
return RedirectToAction("NotApproved");
}
AddAutoLogoutCookie();
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction("VerifyCode", new { Provider = AppSettings.GoogleAuthenticatorProviderName, ReturnUrl = returnUrl, RememberMe = model.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning(2, "User account locked out.");
return View("Lockout");
}
else
{
ModelState.AddModelError(string.Empty, _localizer["Incorrect creds"]);
return View(model);
}
}
Итак, могу ли я использовать это для входа пользователей в приложение Xamarin? Как бы я приблизился к этому грубо? Благодарю.
2 ответа
Ваш вопрос очень широкий, но я постараюсь помочь. Если у вас есть веб-сайт и мобильное приложение, обращающиеся к одной и той же базе данных и использующие одну и ту же бизнес-логику, я бы порекомендовал создать API, ваш API должен обрабатывать аутентификацию и доступ к вашему уровню данных и выполнять операции CRUD. Неважно, что его потребляет (мобильное приложение или веб-сайт).
Ваш веб-сайт и мобильное приложение будут отправлять запросы на этот API, и API отвечает соответственно. для обработки авторизации вы отправляете логин, а API возвращает веб-токен Json или файл cookie (в зависимости от того, что вы используете), а для последующих запросов вы отправляете этот токен вместе с запросом.
Использование Xamarin - переносимая библиотека классов - хорошее место для обработки потребления API, поскольку ее можно повторно использовать на iOS и Android.
Пример того, как может выглядеть ваш запрос Xamarin, если вы используете Json Web Tokens.
public async Task<HttpStatusCode> LoginAsync(CredentialModel credentialModel)
{
var uri = new Uri(UrlResourceNames.LoginUrl);
return await SendCredentialsAsync(credentialModel, uri);
}
private async Task<HttpStatusCode> SendCredentialsAsync(CredentialModel credentialModel, Uri uri)
{
var jsonProduct = JsonConvert.SerializeObject(credentialModel);
var httpContent = new StringContent(jsonProduct, Encoding.UTF8, "application/json");
var response = await _apiConnecter.PostRequest(uri, httpContent);
if (!response.IsSuccessStatusCode)
return response.StatusCode;
string responseJson = await response.Content.ReadAsStringAsync();
var tokenModel = JsonConvert.DeserializeObject<TokenModel>(responseJson);
Settings.JwtToken = tokenModel.Token;
Settings.JwtExpirationDate = tokenModel.Experation;
return response.StatusCode;
}
Затем ваш APIConnector, который может обрабатывать все запросы CRUD к API. В этом примере APIConnector проверяет, присутствует ли Web-токен Json и, если таковой имеется, он отправляет токен со всеми запросами (поскольку в этом примере все запросы, за исключением входа в систему и регистрации, требуют авторизации), API затем проверяет токен.
public class APIConnecter
{
HttpClient _httpClient;
private string _jwtToken;
public APIConnecter()
{
_httpClient = new HttpClient();
ISettings _appSettings;
_appSettings = _appSettings = CrossSettings.Current;
_jwtToken = Settings.JwtToken;
if(!String.IsNullOrEmpty(_jwtToken))
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", _jwtToken);
}
public async Task<HttpResponseMessage> GetRequest(Uri uri)
{
var response = await _httpClient.GetAsync(uri);
return response;
}
public async Task<HttpResponseMessage> DeleteRequest(Uri uri)
{
var response = await _httpClient.DeleteAsync(uri);
return response;
}
public async Task<HttpResponseMessage> PostRequest(Uri uri, HttpContent content)
{
var response = await _httpClient.PostAsync(uri, content);
return response;
}
public async Task<HttpResponseMessage> PutRequest(Uri uri, HttpContent content)
{
var response = await _httpClient.PutAsync(uri, content);
return response;
}
}
Ваш логин на вашем API будет выглядеть примерно так
public async Task<IActionResult> Login([FromBody] CredentialModel credentialModel)
{
var user = await _userManager.FindByEmailAsync(credentialModel.Email);
if (user == null)
return NotFound();
if (_hasher.VerifyHashedPassword(user, user.PasswordHash, credentialModel.Password) != PasswordVerificationResult.Success)
return Unauthorized();
var token = CreateToken(user);
if (token == null)
return StatusCode(500, "A problem happened while handling your request");
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
experation = token.ValidTo
});
}
Я только что видел этот пост. и мог бы сделать следующий код, и я работаю. Мне нужен код для CreateToken(пользователь)
Я потратил много времени на поиски этого фрагмента кода.
У вас есть звонок или какой-то код для получения токена? Я действительно оценю это
Тем не мение.