从cookie获取用户,并在MVC身份中签名该用户



我有一个ASP MVC Web项目。为了出售产品,用户应注册或登录到我的网站。选择其产品后,用户将通过PaymandActy方法重定向到银行网关:

 public String PaymentAction( TransAction Model )
    {
        try
        {
            Payment ob = new Payment();
            Model.amount = 100000.ToString();
            string result = ob.pay(Model.amount);
            //, User.Identity.GetUserId()
            /*
             the result var is a string that contains the response from pay.ir/send
             which contains: status, transId, errorCode, errorMessage and all things that
             exist in JsonParameter
             */
            JsonParameters Parmeters = JsonConvert.DeserializeObject<JsonParameters>(result);
            // in this point the payment was successful and you can add info to your database
            if ( Parmeters.status == 1 )
            {
                Response.Redirect("https://pay.ir/payment/gateway/" + Parmeters.transId);
            }
            else
            {
                return "error code : " + Parmeters.errorCode + "<br />" + "message " + Parmeters.errorMessage;
            }
            return "";
        }
        catch ( Exception exp )
        {
            return "error" + exp.Message;
        }
    }

付款后,用户通过以下URL重定向到我的网站:

http://www.mymvcapp.com/HelpMeToBuildMyExtraordinaryYear/VerifyPayment

这是verifypayment方法:

       [HttpPost]
       [AllowAnonymous]
       public ActionResult VerifyPayment( VerifyResult Vresult )
        {
            try
            {
              if ( !string.IsNullOrEmpty(Request.Form["transId"]) )
            {
                Payment ob = new Payment();
                string result = ob.verify(Request.Form["transId"].ToString());
                JsonParameters Parmeters = JsonConvert.DeserializeObject<JsonParameters>(result);
                if ( Parmeters.status == 1 )
                {
                    var userId = User.Identity.GetUserId();
                    var user = db.Users.Where(u => u.Id == userId).FirstOrDefault();
                    user.SuccessfullPayment = true;
                    user.FactorNo = User.Identity.GetUserId();
                    user.TraceNo = Request.Form["traceNumber"];
                    user.TransId = int.Parse(Request.Form["transId"]);
                    user.CardNo = Request.Form["cardNumber"];
                    user.PurchasedDate = DateTime.Now;
                    user.State = Parmeters.status;
                    user.Message = Request.Form["message"];
                    db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                    db.SaveChanges();
                    Vresult.success = true;
                    Vresult.TransActionID += Request.Form["transId"].ToString();
                    Vresult.Amount += Parmeters.amount.ToString();
                    Vresult.SuccessMessage = "successful payment";
                    return RedirectToAction("Index", "DownloadEbook", new { traceNumber = user.TraceNo , factorNumber = user.FactorNo, purchaseDate =Utils.Funcs.ObtainPersianDate( (DateTime)user.PurchasedDate  ) });
                }
                else
                {
                    Vresult.error = true;
                    Vresult.ErrorMessage = "error code " + Parmeters.errorCode + "<br />" + "Errr meesafe " + Parmeters.errorMessage;
                }
            }
        }
        catch ( Exception ex )
        {
            Vresult.error = true;
            Vresult.ErrorMessage = ex.Source+"t"+ex.InnerException + "t" + ex.Message+"ERRR";
        }
        return View(new AllNeededModels() { VerifyResult = Vresult });

我们可以看到,必须登录用户才能完成销售过程。但是,在从银行重定向到上方的URL(verifyPay(之后,用户未登录,代码将返回null例外。问题是,从银行重定向到我的网站后,我应该如何保持用户登录?或者如何从cookie中获取用户并签署该用户?

在获取用户的过程中,问题是芳香的。我们应该使用此代码以获取用户:

                  var user = System.
                        Web.
                        HttpContext.
                        Current.
                        GetOwinContext().
                        GetUserManager<ApplicationUserManager>().
                        FindById(userId);

请注意,正确的方法如上所述。以下代码会产生问题。Donot使用它来获取当前用户:

             var user = db.Users.Where(u => u.Id == userId).FirstOrDefault();

最新更新