Как я могу использовать вход на веб-сайт 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(пользователь)

Я потратил много времени на поиски этого фрагмента кода.

У вас есть звонок или какой-то код для получения токена? Я действительно оценю это

Тем не мение.

Другие вопросы по тегам