在使用ASP.NET MVC 4进行认证后,User.Identity.Name为空。

问题描述 投票:0回答:1

我正试图检索已登录的用户。但当我登录时,它运行一个错误,说:'Object reference not set to an instance of an object(对象引用未设置为对象的实例)'

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

我的代码如下。


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);
    }

AccountController

        //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();
    }

型号 [Table("User")] public partial class User { [Key] public Guid CustomerId { get; set; }。

    [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个回答
0
投票

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

WebSecurity.Login(userName,password,persistCookie);

用于表单认证使用的cookies。

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

希望这能解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.