none
MVC4 登入功能疑問? RRS feed

  • 問題

  • 專家們好

    我的MVC4專案是使用EF將資料庫匯進來,而目前我在寫會員登入功能

    以下是我的目前進度,不過碰到的問題是不論密碼正確或錯誤總是回到login畫面

    *另外小弟有一個疑問,使用EF會建立EDMX檔案,裡面的models都有備註建議我們不要去修改他,所以我有另開.cs的檔案寫partial class,不過到最後執行會顯示"模稜兩可"錯誤,而我直接進到EF的model寫就不會有"模稜兩可"錯誤了。

    使用資料表: members

    EF的 members model:

    namespace MvcApplication2.Models
    {
        using System;
        using System.Collections.Generic;
        using System.ComponentModel.DataAnnotations;
        using System.Data;
        using System.Data.SqlClient;
        using System.Linq;
        using System.Web;
    
        public partial class members
        {
            public int member_id { get; set; }
            [Required]
            [Display(Name = "User name")]
            public string member_username { get; set; }
            [Required]
            [DataType(DataType.Password)]
            [Display(Name = "Password")]
            public string member_pwd { get; set; }
            public string member_identity { get; set; }
            public string member_name { get; set; }
    
    
            public bool IsValid(string _member_username, string _member_pwd)
            {
                Entities db = new Entities();
                var _userLogin = from m in db.members
                                 where m.member_username == _member_username && m.member_pwd == _member_pwd
                                 select m;
                if (_userLogin != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }

    controller部分:

    namespace MvcApplication2.Controllers
    {
        public class HomeController : Controller
        {
            private Entities db = new Entities();
    
            //
            // GET: /User/
            [Authorize]
            public ActionResult Index()
            {
                return View();
            }
    
            [HttpGet]
            public ActionResult Login()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Login(Models.members user)
            {
                if (ModelState.IsValid)
                {
                    if (user.IsValid(user.member_username, user.member_pwd))
                    {
                        return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                        ModelState.AddModelError("", "Login data is incorrect!");
                    }
                }
                return View(user);
            }
            public ActionResult Logout()
            {
                FormsAuthentication.SignOut();
                return RedirectToAction("Index", "Home");
            }
      }
    }

    VIEW部分:

    @model MvcApplication2.Models.members
    @{
        ViewBag.Title = "Login";
    }
    
    <h2>Login</h2>
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true, "Login failed. Check your login details.");
        <div>
            <fieldset>
                <legend>Login</legend>
                <div class="editor-label">
                    @Html.LabelFor(u => u.member_name)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(u => u.member_username)
                    @Html.ValidationMessageFor(u => u.member_username)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(u => u.member_pwd)
                </div>
                <div class="editor-field">
                    @Html.PasswordFor(u => u.member_pwd)
                    @Html.ValidationMessageFor(u => u.member_pwd)
                </div>
                <input type="submit" value="Log In" />
            </fieldset>
        </div>
    }

    執行沒有任何的錯誤,正確執行的話應該要是登入後會轉跳到Home的Index,但是現在的情況是不論帳號密碼是否正確都不會轉跳到Index,密碼錯誤也不會顯示錯誤訊息

    **另外,我的table裡面有member_identity屬性,這個屬性是判斷登入者的身分,我該如何寫可以讓Role抓我的member_identity屬性來判斷是登入後是否可以進入這個Action?

    Thanks in advance.

    2013年5月11日 上午 11:20

解答

所有回覆

  • 1. 你的 Web.config 要將驗證模式設為 Forms

    2. 你要用 FormsAuthentication.RedirectFromLoginPage(),否則根本不會有驗證 cookie 寫到用戶端,不管你用幾次 Redirect 都沒用。

    http://msdn.microsoft.com/zh-tw/library/ka5ffkce(v=vs.80).aspx


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年5月11日 下午 01:15
    版主
  • 小朱大您好

    我有checked過我的web.config mode是forms沒錯說

    <authentication mode="Forms">

    另外您說的要用 FormsAuthentication.RedirectFromLoginPage(),否則根本不會有驗證 cookie 寫到用戶端,不管你用幾次 Redirect 都沒用。

    但是參考MVC的範本好像也沒有使用到 FormsAuthentication.RedirectFromLoginPage()?

    public ActionResult Login(LoginModel model, string returnUrl)
            {
                if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
                {
                    return RedirectToLocal(returnUrl);
                }
    
                // 如果執行到這裡,發生某項失敗,則重新顯示表單
                ModelState.AddModelError("", "所提供的使用者名稱或密碼不正確。");
                return View(model);
            }
    不好意思我不是在質疑您,只是有點霧煞煞 呵呵^^""


    2013年5月11日 下午 01:38
  • http://www.codeproject.com/Articles/578374/AplusBeginner-27splusTutorialplusonplusCustomplusF

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 CONVENV 2013年5月11日 下午 03:38
    2013年5月11日 下午 02:07
    版主