Как проверить, существует ли запись в таблице Azure с Asp.Net Identity и вернуть пользовательский ответ - PullRequest
0 голосов
/ 09 февраля 2019

Мое мобильное приложение Xamarin.Forms использует Web Api и Asp.Net Identity для регистрации пользователя и сохранения информации в таблице Azure по умолчанию, которая называется dbo.AspNetUsers.Я хотел бы проверить, существует ли запись, перед регистрацией пользователя и вернуть соответствующее сообщение, если пользователь уже существует (в этом случае адрес электронной почты должен быть уникальным).

В моем веб-интерфейсе API:

    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email, FirstName = model.FirstName, LastName = model.LastName, Region = model.Region };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }

        return Ok();
    }

В моем PCL Xamarin.Forms:

public class RegisterBindingModel
{
    public string Email { get; set; }

    public string Region { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Password { get; set; }

    public string ConfirmPassword { get; set; }

}

public async Task<bool> RegisterAsync (string email, string password, string confirmPassword, string firstName, string lastName, string region)
    {
        var client = new HttpClient();

        // create object to send to web api for registering
        var model = new RegisterBindingModel
        {
            Email = email,
            Password = password,
            ConfirmPassword = confirmPassword,
            FirstName = firstName,
            LastName = lastName,
            Region = region
        };

        var json = JsonConvert.SerializeObject(model);

        HttpContent content = new StringContent(json);

        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        // add for API Key
        content.Headers.Add(AppConstants.API_KEY_NAME, AppConstants.API_KEY_VALUE);

        var response = await client.PostAsync(AppConstants.AZURE_WEB_API_REGISTER_URL, content);

        return response.IsSuccessStatusCode;
    }

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Спасибо @Jason за помощь.Это было легко в конце.Вот как я это решил:

    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email, FirstName = model.FirstName, LastName = model.LastName, Region = model.Region };

        var existingUser = await UserManager.FindByEmailAsync(user.Email);

        if (existingUser == null)
        {
            IdentityResult result = await UserManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                return GetErrorResult(result);
            }

            return Ok();
        }
        else
        {
            var errorModel = new
            {
                error = new
                {
                    code = 400,
                    message = "Email already exists"
                }
            };
            return Content(HttpStatusCode.BadRequest, errorModel);
        }         
    }
0 голосов
/ 09 февраля 2019

беглый взгляд на документы для UserManager показывает FindByNameAsync метод

...