2017-06-22 100 views
1

我正在我的MVC项目的登录页面上工作。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();用户给我一个错误,说明非invocable成员Entities.User不能像方法一样使用。

我已经看到相当多的人有同样的问题,人们建议他们应该删除大多数人解决问题的括号。但是,当我删除它的作品,我可以登录。但我可以登录每个可能的登录名和登录密码。当我登录时,登录帐户是我的表中的第一个帐户。

我已经连接到我的数据库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   [email protected] Welcome123 
2   [email protected] Welcome1234 
3   [email protected] Welcome12345 

所以,无论电子邮件住址:[email protected]他会登录到[email protected]

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

让我知道如果我错过了你可能需要解决的任何代码。

+0

是的我有,但是当我删除括号并且用[email protected]登录时,它使用帐户[email protected]登录我。所以没有进行验证。 – HJarry

+0

请分享databaseManager.MDFUser()方法代码。 – Conqueror

+0

它在我上面显示的accountcontroller我认为 – HJarry

回答

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... 
+0

我试过了,但它现在给我一个错误logininfo不存在于当前上下文 – HJarry

+0

不知道明白了。你刚刚救了我的生命我的朋友! – HJarry

+0

@HJarry没有问题 - 我指出另外一件事(只是为了防止你这样做):不要将密码作为纯文本存储在数据库中。 – scgough