我正在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
。
我希望你们能解决我的问题。
如果我错过了您可能需要解决的任何代码,请告诉我。
答案 0 :(得分:1)
因为他正在使用S.Proc LoginByUsernamePassword
,所以它接受username
和password
作为参数(就像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...