iT邦幫忙

1

mvc 請問如何抓取已登入會員的帳號跟資料?

小弟目前還在自學MVC的 Coding,已經做好登入登出跟註冊系統,可是現在差在要『修改會員資料』與『修改密碼』。
我的想法是把登入的資訊(包括數量Num跟帳號ID值)抓出來,我驗證登入的方式是抓取Session,可是我從ChangePassword中,抓出的Session值是亂碼,無法抓到正確的登入帳號相關資訊,請問各位有甚麼方法可以從controller中抓取帳號的資訊嗎?

我的改密 Model:

public class ChangePassword
    {
        [Required]
        [DataType(DataType.Password)]
        [Display(Name ="舊密碼")]
        public string OldPassword { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "新密碼")]
        public string NewPassword { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "再次確認新密碼")] 
        [Compare("NewPassword", ErrorMessage = "新密碼與確認密碼不相符。")]
        public string ConfirmPassword { get; set; }
        
        public int ID { get; set; }
        public string ChangePasswordErrorMsg {get;set;}

***我的改密 View:


@model MenberSystem.Models.ChangePassword
@{
    ViewBag.title = "變更密碼";
    if (Session["menberID"] == null)
    {
        Layout = "_Layout.cshtml";
        Response.Redirect("~/Account/Login");
    }
}

<h2>@ViewBag.title</h2>
@using (Html.BeginForm("ChangePassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>變更密碼表單</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(m => m.OldPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.NewPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="變更密碼" class="btn btn-info" />
            <input type="reset" value="重新輸入" class="btn btn-warning" />
            <input type="button" value="上一頁" class="btn btn-dark" onclick="history.back()">
        </div>
    </div>
}
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

我的登入 controller

   var menberDetail = db.Menber.Where(x => x.ID == menber.ID && x.Password == menber.Password).FirstOrDefault();
                if (menberDetail == null)
                {
                    menber.LoginMessLoginErrorMsg = "輸入錯誤 ";
                    TempData["message"] = "輸入錯誤,請重新輸入";
                    return View("Login", menber);

                }
                else
                {

                    Session["menberID"] = menber.ID;
                    TempData["message"] = "登入成功";
                    return RedirectToAction("Index", "Home");
小魚 iT邦大師 1 級 ‧ 2019-05-07 21:09:30 檢舉
登入的時候不是就會知道帳號了嗎?
把帳號用Session等方式記下來吧...
小魚:你好
我登入時用Session的模式沒錯,只是新增改密碼的地方需要抓取登入user的帳號資訊 (如ID跟Password還有一些當時註冊的資料)
我用 CurrentUser = Session["menberID"]; 時,抓出來的值是對的,只是我不知道該怎麼去資料庫抓 帳號=抓取的值 來在『修改密碼』的controller下使用?
我有Google過 Identity的使用,可是依然看不懂怎麼去抓正確的user帳號。
Homura iT邦高手 1 級 ‧ 2019-05-08 13:43:28 檢舉
改密碼的controller方法也貼一下
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
舜~
iT邦高手 1 級 ‧ 2019-05-08 09:37:19

給您參考
ASP.NET MVC 5 - Identity. How to get current ApplicationUser

using Microsoft.AspNet.Identity;

var currentUserId = User.Identity.GetUserId();
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

或是

var currentUserId = System.Web.HttpContext.Current.User.Identity.GetUserId();

Homura大大的建議,若您沒有使用Identity,目前是用SESSION就先用SESSION吧

看更多先前的回應...收起先前的回應...

舜:你好
謝謝,我測試看看。

舜~:你好
我利用你上面說的方法,改成

var currentUserId = User.Identity.GetUserId();
                    Menber currentUser = db.Menber.FirstOrDefault(x => x.ID == currentUserId);

可是抓到的currntUserId = null值;
然後 Menber currentUser = null值。

我改利用這個方法測試,

var currentUserId = System.Web.HttpContext.Current.User.Identity.GetUserId();

抓到的 currentUserId = null值。

請問我是哪裡有下錯code以致抓到空值嗎?

我原本的想法是增加:
因為我在Login的條件登入後,我回傳 Session["menberID"]=menber.ID;可以到其他頁面做Session的驗證,也在改密碼的controller中抓到Session的值=帳號的值。

var CurrentUserID = Session["menberID"];

只是我不明白該如何把我抓到的Session["menberID"]的值轉換成去抓取資料庫=帳號來表示是使用者的資訊呢?

Homura:你好
下方是我修改密碼的controller

if (Session["menberID"] != null)
                {
                    MenberSystemEntities2 db = new MenberSystemEntities2();
                    var CurrentUserID = Session["menberID"];

                
                try
                    {
                        if (db.Menber.Where(p => p.Password == changePassword.OldPassword).FirstOrDefault() != null)
                        {
                            if (changePassword.NewPassword != changePassword.ConfirmPassword)
                            {
                                TempData["message"] = "新密碼與確認密碼錯誤,請重新輸入";
                                return View();
                            }
                            else
                            {
                               // user.passwor = changePassword.NewPassword;
                                db.SaveChanges();
                                return RedirectToAction("Login");
                            }
                        }
                        else
                        {
                            changePassword.ChangePasswordErrorMsg = "密碼輸入錯誤,請重新輸入";
                            TempData["message"] = "輸入錯誤";
                            return View();
                        }
                    }

                    catch (Exception ex)
                    {
                        ModelState.AddModelError("OldPassword", ex.Message);
                        return View(changePassword);
                    }
                   
                }
            return View();

我原本的想法是增加:
因為我在Login的條件登入後,我回傳 Session["menberID"]=menber.ID;可以到其他頁面做Session的驗證,也在改密碼的controller中抓到Session的值=帳號的值。

var CurrentUserID = Session["menberID"];

只是我不明白該如何把我抓到的Session["menberID"]的值轉換成去抓取資料庫=帳號來表示是使用者的資訊呢?這個方法是可行的嗎?

Homura iT邦高手 1 級 ‧ 2019-05-08 14:16:04 檢舉

terpoo1250
你的Session值是亂碼長怎樣
可以截張圖嗎?

Homura:你好
我一開始在登入那邊的時候看Session["menberID"]的值是
https://ithelp.ithome.com.tw/upload/images/20190508/20116639ygsFzvhhQ5.png

這時候我才發現,亂馬是屬於Session的ID值,因為我一開始抓出來的值確實是Session的ID值亂碼,我就誤以為是那個亂碼。

但是我從ChangePassword controller那邊抓回來的值是對的;
https://ithelp.ithome.com.tw/upload/images/20190508/20116639vDpDxPkgBT.png
我抓到值後,想要跟資料庫的帳號做判斷條件,IF我的Session["menberID"]的值=DB的帳號ID值,就把符合ID的值所有資料(Include : Password Email Phone...)都抓出來,然後可以指定修改其Password、Email、Phone...相關的值。
只是我現在有想法可是不知道該如何下手...。

Homura iT邦高手 1 級 ‧ 2019-05-08 14:50:53 檢舉

terpoo1250
可是你第一張圖照的是SessionID不是Session["menberID"]耶..../images/emoticon/emoticon16.gif
你這個方法是沒問題的

一開始我以為Identity可以幫我抓到User的ID值,可以上網查資料放入自己的Code中,卻發現抓到的User.Identity.GetUserId()值都是null值,我想問是我抓錯方法還是我下錯Code?

Homura:你好
沒錯,不過我再去看Session["menberID"]的值確實是我要的正確值沒錯,我看錯Session的ID碼。

Homura iT邦高手 1 級 ‧ 2019-05-08 15:37:55 檢舉

terpoo1250
你要使用Identity認證才會有資料@@
可以查查ASP.NET Identity的教學
這是MSDN的教學
你目前是用SESSION就先用SESSION吧

我要發表回答

立即登入回答