MVC登录功能

时间:2017-06-22 08:42:59

标签: c# asp.net-mvc login

我正在MVC项目的登录页面上工作。

我想用一个名为DEVE03的现有数据库构建它。在DEVE03数据库中,我有一个名为User的表。我按照这里的教程:http://www.c-sharpcorner.com/article/Asp-Net-mvc-5-integrating-existing-database-with-login-usin/工作正常。但是在教程中他使用了存储过程,而我正在使用表。

除了一个以外,每件事都有效。代码的这一部分是哪个var loginInfo = this.databaseManager.User(model.LogonName, model.LogonPassword).ToList();用户给出了一个错误,指出不可调用的成员Entities.User不能像方法一样使用。

我见过很多人有同样的问题,人们建议他们应该删除解决大多数人问题的括号。但是,当我删除括号时,我可以登录。但我可以使用每个可能的登录名和logonpassword登录。当我登录时,登录帐户是我表格中的第一个帐户。

我已经连接了我的数据库visual studio,我已经创建了一个名为CMS的实体数据模型。

我希望你们能帮助我

帐户管理员:

using System;
using System.Globalization;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using System.Collections.Generic;
using Microsoft.AspNet.Identity.EntityFramework;
using CMS.Models;
using CMS.Models.DatabaseModels;

namespace CMS.Controllers
{

public class AccountController : Controller
{
    #region Private Properties    

    private Entities databaseManager = new Entities();
    #endregion
    #region Default Constructor    

    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;

    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

    public AccountController()
    {
    }
    #endregion
    #region Login methods    
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        try
        {
            // Verification.    
            if (this.Request.IsAuthenticated)
            {
                // Info.    
                return this.RedirectToLocal(returnUrl);
            }
        }
        catch (Exception ex)
        {
            // Info    
            Console.Write(ex);
        }
        // Info.    
        return this.View();
    }
    /// <summary>  
    /// POST: /Account/Login    
    /// </summary>  
    /// <param name="model">Model parameter</param>  
    /// <param name="returnUrl">Return URL parameter</param>  
    /// <returns>Return login view</returns>  
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        try
        {
            // Verification.    
            if (ModelState.IsValid)
            {
                // Initialization.    
                var loginInfo = this.databaseManager.MDFUser(model.LogonName, model.LogonPassword).ToList();
                // Verification.    
                if (loginInfo != null && loginInfo.Count() > 0)
                {
                    // Initialization.    
                    var logindetails = loginInfo.First();
                    // Login In.    
                    this.SignInUser(logindetails.LogonName, false);
                    // Info.    
                    return this.RedirectToLocal(returnUrl);
                }
                else
                {
                    // Setting.    
                    ModelState.AddModelError(string.Empty, "Email or password is incorrect");
                }
            }
        }
        catch (Exception ex)
        {
            // Info    
            Console.Write(ex);
        }
        // If we got this far, something failed, redisplay form    
        return this.View(model);
    }
    #endregion
    #region Log Out method.    
    /// <summary>  
    /// POST: /Account/LogOff    
    /// </summary>  
    /// <returns>Return log off action</returns>  

    public ActionResult LogOff()
    {
        try
        {
            // Setting.    
            var ctx = Request.GetOwinContext();
            var authenticationManager = ctx.Authentication;
            // Sign Out.    
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        }
        catch (Exception ex)
        {
            // Info    
            throw ex;
        }
        // Info.    
        return this.RedirectToAction("Login", "Account");
    }
    #endregion
    #region Helpers    
    #region Sign In method.    
    /// <summary>  
    /// Sign In User method.    
    /// </summary>  
    /// <param name="username">Username parameter.</param>  
    /// <param name="isPersistent">Is persistent parameter.</param>  
    private void SignInUser(string username, bool isPersistent)
    {
        // Initialization.    
        var claims = new List<Claim>();
        try
        {
            // Setting    
            claims.Add(new Claim(ClaimTypes.Name, username));
            var claimIdenties = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
            var ctx = Request.GetOwinContext();
            var authenticationManager = ctx.Authentication;
            // Sign In.    
            authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, claimIdenties);
        }
        catch (Exception ex)
        {
            // Info    
            throw ex;
        }
    }
    #endregion
    #region Redirect to local method.    
    /// <summary>  
    /// Redirect to local method.    
    /// </summary>  
    /// <param name="returnUrl">Return URL parameter.</param>  
    /// <returns>Return redirection action</returns>  
    private ActionResult RedirectToLocal(string returnUrl)
    {
        try
        {
            // Verification.    
            if (Url.IsLocalUrl(returnUrl))
            {
                // Info.    
                return this.Redirect(returnUrl);
            }
        }
        catch (Exception ex)
        {
            // Info    
            throw ex;
        }
        // Info.    
        return this.RedirectToAction("Index", "Home");
    }
    #endregion

    #region Helpers
    // Used for XSRF protection when adding external logins
    private const string XsrfKey = "XsrfId";

    private IAuthenticationManager AuthenticationManager
    {
        get
        {
            return HttpContext.GetOwinContext().Authentication;
        }
    }

    private void AddErrors(IdentityResult result)
    {
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError("", error);
        }
    }

    internal class ChallengeResult : HttpUnauthorizedResult
    {
        public ChallengeResult(string provider, string redirectUri)
            : this(provider, redirectUri, null)
        {
        }

        public ChallengeResult(string provider, string redirectUri, string userId)
        {
            LoginProvider = provider;
            RedirectUri = redirectUri;
            UserId = userId;
        }

        public string LoginProvider { get; set; }
        public string RedirectUri { get; set; }
        public string UserId { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
            if (UserId != null)
            {
                properties.Dictionary[XsrfKey] = UserId;
            }
            context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
        }
    }
    #endregion
    #endregion
}

}

LoginViewModel:

    public class LoginViewModel
    {
    [Required]
    [Display(Name = "Email")]
    [EmailAddress]
    public string LogonName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string LogonPassword { get; set; }

    public bool RememberMe { get; set; }
}

用户表看起来:

UserID    LogonName         LogonPassword
1         test1@test.com    Welcome123
2         test2@test.com    Welcome1234
3         test3@test.com    Welcome12345

所以我用来登录的电子邮件地址为:mike.hopkins@gmail.com他将登录test1@test.com

我希望你们能解决我的问题。

如果我错过了您可能需要解决的任何代码,请告诉我。

1 个答案:

答案 0 :(得分:1)

因为他正在使用S.Proc LoginByUsernamePassword,所以它接受usernamepassword作为参数(就像C#中的方法一样)。

在您的情况下,MDFUser是数据库中的一个表,因此您无法做到这一点。

当你删除括号时,你有效地说:

var loginInfo = this.databaseManager.MDFUser.ToList();

为我提供MDFUser

中所有内容的列表

你需要查询这样的表格(如果语法不是100%现货,请原谅我。)

 var loginInfo = this.databaseManager.MDFUser.Where(n=>n.username == 
                   model.username && n.password == model.password).ToList();
 ...other code...