我是編程新手,我的程式沒有出現任何錯誤,但我的登錄無效,當我輸入密碼和用戶名并單擊按鈕時,它沒有進入管理頁面 - 實際上沒有t 去任何地方并回傳登錄頁面(本身)。
我的管理操作方法具有[Authorize]屬性,我認為在資料庫中一切正常,并且資料插入了種子資料。請幫忙。
啟動檔案
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStatusCodePagesWithRedirects("/Home/Error");
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
賬戶控制器.cs
public IActionResult Login()
{
return View();
}
[HttpPost]
public IActionResult Login(Admin login, FormCollection form)
{
if (ModelState.IsValid)
{
var user = loginRepository.IsExistUser(login.UserName, login.Password);
if (user != "")
{
return Redirect("/Home/Admin");
}
else
{
ModelState.AddModelError("UserName", "there is no user");
}
}
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier,login.LoginID.ToString()),
new Claim(ClaimTypes.Name,login.UserName),
new Claim(ClaimTypes.Name,login.Password),
};
var Identity = new ClaimsIdentity(claims, `enter code here`CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(Identity);
var properties = new AuthenticationProperties
{
IsPersistent = login.RememberMe
};
HttpContext.SignInAsync(principal, properties);
//********recaptcha * ********
string urlToPost = "https://www.google.com/recaptcha/api/siteverify";
string secretKey = "";
string gRecaptchaResponse = form["g-recaptcha-response"];
var postData = "secret=" secretKey "&response=" gRecaptchaResponse;
// send post data
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlToPost);
request.Method = "POST";
request.ContentLength = postData.Length;
request.ContentType = "application/x-www-form-urlencoded";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(postData);
}
// receive the response now
string result = string.Empty;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
result = reader.ReadToEnd();
}
}
ViewBag.IsSuccess = false;
return View("login");
}
public IActionResult Lougout()
{
HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Redirect("/Account/Login");
}
登錄庫.cs
public string IsExistUser(string username, string password)
{
return db.Admin.SingleOrDefault(u => u.UserName == username && u.Password == password).ToString();
}
ILoginRepository.cs
string IsExistUser(string username, string password);
登錄.cshtml
@model DataLayer.Admin
@{
ViewData["LoginTitle"] = "sign in";
Layout = "/Views/Shared/_LoginLayout.cshtml";
}
<div class="container">
<form onsubmit="return true" name="loginform" method="post" class="box box1 band form pb-3 pt-3 col-lg-12 col-md-12 col-sm-12 col-12">
<div class="row">
<div class="form-group floating-label-group col-12">
<i class="zmdi zmdi-account userdarkmode userdarkmode1"></i>
<input asp-for="UserName" name="UserName" class="form-control UserName UserName1" required title="enter your username" />
<label asp-for="UserName" class="control-label floating-label-username floating-label-username1">username:</label>
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row">
<div class="form-group floating-label-group col-12">
<i class="zmdi zmdi-key keydarkmode keydarkmode1"></i>
<input asp-for="Password" name="Password" class="form-control Password Password1" autocomplete="off" required title="entere your password" />
<label asp-for="Password" class="control-label floating-label-password floating-label-password1">password:</label>
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row">
<div class="form-group">
<input asp-for="RememberMe" class="form-check-input form-control rememberdarkmode rememberdarkmode1 col-1" name="RememberMe" />
<label asp-for="RememberMe" class="form-check-label rememberdarkmode rememberdarkmode1 opt col-11"></label>
</div>
</div>
<div class="form-group col-12">
<input type="submit" value="enter" asp-action="Admin" asp-controller="Home" class="btn btn-outline-success form-control col-6" />
</div>
<div>
<a asp-action="Index" asp-controller="Home" class="text text1 col-6 text-secondary">go to form</a>
</div>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
模型.cs
using System.ComponentModel.DataAnnotations;
namespace DataLayer
{
public class Admin
{
[Key]
public int LoginID { get; set; }
[Display(Name = "username")]
[Required(ErrorMessage = "please enter your username")]
[MaxLength(20)]
public string UserName { get; set; }
[Display(Name = "password")]
[Required(ErrorMessage = "please enter your password")]
[MaxLength(20)]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "remember me")]
public bool RememberMe { get; set; }
}
}
家庭控制器
[Authorize]
public IActionResult Admin()
{
return View();
}
而且我的模型驗證也不起作用(asp-validation-for在輸入中) - 我不知道為什么。
uj5u.com熱心網友回復:
您在按鈕引數中在哪里呼叫函式?
使用https://getbootstrap.com/docs/5.0/components/buttons/
-> 使用button,而不是input type="submit"。
https://stackoverflow.com/a/33663114/11394571
你需要一個https://www.educba.com/button-in-asp-net/:
OnClick="Login"
uj5u.com熱心網友回復:
看看你表格的這一部分:
<div class="form-group col-12">
<input type="submit" value="enter" asp-action="Admin" asp-controller="Home" class="btn btn-outline-success form-control col-6" />
</div>
您正在向 Home Controller 中的 Admin 操作發布您的請求。您沒有將其發送到您的 AccountController。將其更改為 asp-action="Login" asp-controller="Account" 。
關于模型驗證,您應該在 HttpPost 登錄名中包含以下內容:
if(!ModelState.IsValid)
{
return View(login);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397524.html
標籤:C# 网站 asp.net核心 asp.net 身份 身份
上一篇:注入startup.cs中的所有服務,.netcore,多載
下一篇:使用user.Email和await_userManager.GetEmailAsync(user)有什么區別?
