Регистрация пользователя asp.net ошибка модели идентификации


Я создаю веб-сайт, используя asp.net личность. Я создал модель данных на основе значения по умолчанию asp.net таблицы идентификаторов, использующие localdb. Когда я пытаюсь зарегистрировать нового пользователя, я получаю сообщение об ошибке Bitev2.Models.AspNetUserLogin: : EntityType 'AspNetUserLogin' has no key defined. Define the key for this EntityType. AspNetUserLogins: EntityType: EntitySet 'AspNetUserLogins' is based on type 'AspNetUserLogin' that has no keys defined., однако модель AspNetUserLogin автоматически генерируется и не содержит ключа.

Любая помощь будет весьма признательна.

Модель AspNetUserLogin

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Bitev2.Models
{
    using System;
    using System.Collections.Generic;

    public partial class AspNetUserLogin
    {
        public string UserId { get; set; }
        public string LoginProvider { get; set; }
        public string ProviderKey { get; set; }

        public virtual AspNetUser AspNetUser { get; set; }
    }
}

AspNetLogins таблица / модель

AspNetLogins таблица / модель

1 3

1 ответ:

Как я сказал вчера , Asp.Net идентичность-это нечто иное!

Я создал модель данных, основанную на значении по умолчанию asp.net таблицы идентификаторов, использующие localdb.

Этот шаг не требуется для регистрации нового пользователя. Таблица AspNetUserLogin имеет другое назначение, заключающееся в сохранении внешних Логинов для текущего пользователя. Таким образом, пользователь может войти в систему из Google, Facebook и т. д.

Чтобы просто зарегистрировать пользователя, пожалуйста, удалите таблицы AspNet**** из вашу модель и напишите такой код:

     //GET
    [AllowAnonymous]
    public ActionResult RegisterNewUser()
    {
        return View();
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> RegisterNewUser(RegisterNewUserViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                UserName = userViewModel.Email,
                Email = userViewModel.Email,
                EmailConfirmed =true
            };
            var adminresult = await UserManager.CreateAsync(user, userViewModel.Password);

            //Add User to the Roles 
               string[] selectedRoles=new string[]{"Developer","Tester","Robbot"};
            if (adminresult.Succeeded)
            {
                if (selectedRoles != null)
                {
                    var result = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
                    if (!result.Succeeded)
                    {
                        ModelState.AddModelError("", result.Errors.First());
                        return View();
                    }
                }
            }
            else
            {
                ModelState.AddModelError("", adminresult.Errors.First());
                return View();

            }
            return RedirectToAction("Index");
        }
        return View();
    }

Чтобы использовать AspNetUserLogin, вам нужно два метода или шага:

  • Первый метод-это тот, который будет запрашивать перенаправление к внешнему поставщику входа ExternalLogin, например, и

  • Второй метод/шаг, который вам нужен, - это тот, который сохранит внешний логин в таблице AspNetUserLogin. это, без того, чтобы эта таблица была сгенерирована в вашей модели. Назовем этот метод ExternalLoginConfirmation.

Потребность код?

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
     return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }


    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
    {
        if (User.Identity.IsAuthenticated)
        {
            return RedirectToAction("Index", "Manage");
        }

        if (ModelState.IsValid)
        {
            var info = await AuthenticationManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                return View("ExternalLoginFailure");
            }
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user);
            if (result.Succeeded)
            {
              //saving the External Login in the   `AspNetUserLogin` table
                result = await UserManager.AddLoginAsync(user.Id, info.Login);
                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                    return RedirectToLocal("local url here");
                }
            }

            foreach (var error in result.Errors)
            {
             ModelState.AddModelError("", error);
            }
        }

        ViewBag.ReturnUrl = returnUrl;
        return View(model);
    }

Вам понадобится этот класс, чтобы!

    internal class ChallengeResult : HttpUnauthorizedResult
    {
        public ChallengeResult(string provider, string redirectUri)
            : this(provider, redirectUri, null)
        {
        }

        public ChallengeResult(string provider, string redirectUri, string userId)
        {
            LoginProvider = provider;
            RedirectUri = redirectUri;
            UserId = userId;
        }

        public string LoginProvider { get; set; }
        public string RedirectUri { get; set; }
        public string UserId { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
            if (UserId != null)
            {
                properties.Dictionary[XsrfKey] = UserId;
            }
            context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
        }
    }

Если вам нужна дополнительная информация или вы столкнулись с проблемой отсутствия типов, смотрите этот пост

Надеюсь, что это поможет вам...

С Уважением!