【问题标题】:User.Identity.Name is getting is null after authentication using ASP.NET MVC 4使用 ASP.NET MVC 4 进行身份验证后,User.Identity.Name 为 null
【发布时间】:2020-09-22 09:29:05
【问题描述】:

我正在尝试检索已登录的用户。但是当我登录时,它运行一个错误,提示:'对象引用未设置为对象的实例'

所以我在这里要做的是登录并将用户详细信息显示到索引页面。但是由于遇到的错误,现在我无法登录。

我的代码如下:


HomeController

    [Authorize]
    public ActionResult Index()
    {
        var mods = new mymodel();
        var UserId = User.Identity.Name;
        var user = db.Users.Where(x => x.IDno == UserId).FirstOrDefault();

        user.FirstName = user.FirstName;


        var data = (from rv in db.RequestVouchers
                    join cust in db.Users on rv.IDno equals cust.IDno
                    where rv.IDno == UserId
                    select new
                    {
                        HouseNumber = rv.HouseNumber,
                        Address = rv.Address,
                        City = rv.City,
                        Province = rv.Province,
                        PostalCode = rv.PostalCode,
                        Status = rv.Status,

                        VoucherNumber = rv.VoucherNumber,
                        TrackingOrder = rv.TrackingOrder,
                        CreatedDate = rv.CreatedDate

                    }).OrderByDescending(x => x.CreatedDate).FirstOrDefault();



        if (data != null)
        {
            //ViewBag.IDno = data.IDno;
            ViewBag.HouseNumber = data.HouseNumber;
            ViewBag.Address = data.Address;
            ViewBag.City = data.City;
            ViewBag.Province = data.Province;
            ViewBag.PostalCode = data.PostalCode;
            ViewBag.Status = data.Status;
            ViewBag.TrackingOrder = data.TrackingOrder;
            ViewBag.VoucherNumber = data.VoucherNumber;
        }

        else
        {
            ViewBag.HouseNumber = "";
            ViewBag.Address = "";
            ViewBag.City = "";
            ViewBag.Province = "";
            ViewBag.PostalCode = "";
            ViewBag.Status = "";
            ViewBag.TrackingOrder = "";
            ViewBag.VoucherNumber = "";
        }

        return View(user);
    }

帐户控制器

        //Login
         [HttpGet]
    public ActionResult Signin()
    {

        return View();
    }

    //Login Post
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Signin(UserLogin login, string ReturnUrl = "")
    {
        string message = "";
        using (mymodel dc = new mymodel())
        {
            var v = dc.Users.Where(a => a.IDno == login.IDno).FirstOrDefault();
            if (v != null)
            {
                if (!v.IsEmailVerified)
                {
                    ViewBag.Message = "Please verify your ID number first";
                    return View();
                }
                if (string.Compare(Crypto.Hash(login.Password), v.Password) == 0)
                {
                    int timeout = login.RememberMe ? 525600 : 20; // 525600 min = 1 year
                    var ticket = new FormsAuthenticationTicket(login.IDno, login.RememberMe, timeout);
                    string encrypted = FormsAuthentication.Encrypt(ticket);
                    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
                    cookie.Expires = DateTime.Now.AddMinutes(timeout);
                    cookie.HttpOnly = true;
                    Response.Cookies.Add(cookie);


                    if (Url.IsLocalUrl(ReturnUrl))
                    {
                        return Redirect(ReturnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home", "Home");
                    }

                }
                else
                {
                    message = "Invalid credential provided";
                }
            }
            else
            {
                message = "Invalid credential provided";
            }
        }
        ViewBag.Message = message;
        return View();
    }

型号 [表(“用户”)] 公共部分类用户 { [钥匙] 公共 Guid CustomerId { 获取;放; }

    [Required(ErrorMessage = "Firstname is required")]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Lastname is required")]
    [StringLength(50)]
    public string LastName { get; set; }

    [Required(ErrorMessage = "SA ID Number is required")]
    public string IDno { get; set; }

    [Required]
    [StringLength(254)]
    public string EmailId { get; set; }

    [Required(ErrorMessage = "SA Phone Number is required")]
    [StringLength(100)]
    public string PhoneNumber { get; set; }

    [Required]
    public string Location { get; set; }

    [StringLength(50)]
    public string HouseNumber { get; set; }

    [StringLength(50)]
    public string PostalCode { get; set; }

    public DateTime? CreatedDate { get; set; }

    [Required(ErrorMessage = "Password is required")]
    [MembershipPassword(MinRequiredNonAlphanumericCharacters = 1, MinNonAlphanumericCharactersError = "Your password needs to contain at least one symbol (!, @, #, etc).", ErrorMessage = "Your password must be 6 characters long and contain at least one symbol (!, @, #, etc).", MinRequiredPasswordLength = 6)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Required(ErrorMessage = "Confirm Password is required")]
    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }

    public bool IsEmailVerified { get; set; }

    public Guid ActivationCode { get; set; }

    [StringLength(100)]
    public string ResetPasswordCode { get; set; }
}

  public class UserLogin
   {
    [Display(Name = "IDno")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "ID Number required")]
    public string IDno { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Password required")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    [Display(Name = "Remember Me")]
    public bool RememberMe { get; set; }
}

Web.config

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-3 model-view-controller


    【解决方案1】:

    如果您使用WebMatrix,请使用以下方式登录

    WebSecurity.Login(userName,password,persistCookie);
    

    对于带有表单身份验证的 cookie 使用:

    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
    

    希望这能解决您的问题

    【讨论】:

    • 登录后仍然收到用户为空的错误
    • 我认为var user = db.Users.Where(x => x.IDno == UserId).FirstOrDefault(); 是你卡住的地方,因为User.Identity.Name 返回的名称不是id
    • 是的,这就是我卡住的地方,但 User.Identity.Name 是 IDno(ID 号)的字符串。我需要知道我在哪里错过它。 @msh
    • 你应该写 var user = db.Users.Where(x => x.Name == UserId).FirstOrDefault(); 而不是 var user = db.Users.Where(x => x.IDno == UserId).FirstOrDefault(); ,这是因为 User.Identity.Name 获取名称而不是 id。比较名字和名字
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2010-11-27
    • 2013-08-29
    • 1970-01-01
    • 2018-03-19
    • 2017-12-10
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多