[英]Second login form in one solution
I start use ASP.Net Identity in my app.我开始在我的应用程序中使用 ASP.Net Identity。 I have one page (/identity/account/login) where i can type login and password and login to page.我有一个页面(/identity/account/login),我可以在其中输入登录名和密码并登录到页面。 But i want create second login page in home page.但我想在主页中创建第二个登录页面。 In home page i have button who create pop-up where i would like create second login form.在主页中,我有创建弹出窗口的按钮,我想在其中创建第二个登录表单。 It is posible?有可能吗?
First login form (deafult):首次登录表单(默认):
Second login form (as pop-up in home page):第二个登录表单(作为主页中的弹出窗口):
In home page i try something like this, but it doesn't work <partial name="~/Areas/Identity/Pages/Account/Login.cshtml" model="@LoginModel" view-data="ViewData" />
在主页我尝试这样的事情,但它不起作用<partial name="~/Areas/Identity/Pages/Account/Login.cshtml" model="@LoginModel" view-data="ViewData" />
In home page i have button who create pop-up where i would like create second login form.在主页中,我有创建弹出窗口的按钮,我想在其中创建第二个登录表单。 It is posible?有可能吗?
It seems that you'd like to display login page in a popup window while a non-authenticated user access home page, to achieve the requirement, you can try to create another login page as a partial view and load it in your home page, like below.似乎您想在未经身份验证的用户访问主页时在弹出窗口 window 中显示登录页面,为了达到要求,您可以尝试创建另一个登录页面作为部分视图并将其加载到您的主页中,如下所示。
_UserLogin.cshtml _UserLogin.cshtml
@model MyLoginModel
<div class="row">
<div class="col-md-4">
<section>
<form id="account" asp-controller="Account" asp-action="Login" method="post">
<h4>Use a local account to log in.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Input.Email"></label>
<input asp-for="Input.Email" class="form-control" />
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.Password"></label>
<input asp-for="Input.Password" class="form-control" />
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
<div class="form-group">
<div class="checkbox">
<label asp-for="Input.RememberMe">
<input asp-for="Input.RememberMe" />
@Html.DisplayNameFor(m => m.Input.RememberMe)
</label>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Log in</button>
</div>
<div class="form-group">
<p>
<a id="forgot-password" asp-page="/Areas/Identity/Pages/Account/ForgotPassword">Forgot your password?</a>
</p>
<p>
<a asp-page="/Areas/Identity/Pages/Account/Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
<p>
<button type="submit" asp-page-handler="SendVerificationEmail" class="btn-link" style="padding:0px;margin:0px;border:0px">Resend email confirmation</button>
</p>
</div>
</form>
</section>
</div>
<div class="col-md-6 col-md-offset-2">
<section>
<h4>Use another service to log in.</h4>
<hr />
@{
if ((Model.ExternalLogins?.Count ?? 0) == 0)
{
<div>
<p>
There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a>
for details on setting up this ASP.NET application to support logging in via external services.
</p>
</div>
}
else
{
<form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal">
<div>
<p>
@foreach (var provider in Model.ExternalLogins)
{
<button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
}
</p>
</div>
</form>
}
}
</section>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
MyLoginModel class MyLoginModel class
public class MyLoginModel
{
public InputModel Input { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public string ReturnUrl { get; set; }
[TempData]
public string ErrorMessage { get; set; }
public class InputModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
}
Account controller帐号 controller
public class AccountController : Controller
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(SignInManager<IdentityUser> signInManager,
UserManager<IdentityUser> userManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public async Task<IActionResult> Login(MyLoginModel myLoginModel, string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(myLoginModel.Input.Email, myLoginModel.Input.Password, myLoginModel.Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = myLoginModel.Input.RememberMe });
}
if (result.IsLockedOut)
{
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View();
}
}
// If we got this far, something failed, redisplay form
return View();
}
}
In Home page在首页
<div id="myModal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<div class="modal-body">
<partial name="_UserLogin" model='new MyLoginModel { ReturnUrl = "/" }' />
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
Test Result测试结果
Ok, I found a solution.好的,我找到了解决方案。 I create second method using to login in HomeController page我创建了用于登录 HomeController 页面的第二种方法
View (in my case _Layout) - login popup:查看(在我的情况下为 _Layout)- 登录弹出窗口:
<div class="form-group">
<label>Email</label>
<input type="email" class="form-control" name="email" id="email">
<i class="icon_mail_alt"></i>
</div>
<div class="form-group">
<label>Password</label>
<input type="password" class="form-control" name="password" id="password" value="">
<i class="icon_lock_alt"></i>
</div>
<div class="text-center">
<input type="submit" value="Log In" class="btn_1 full-width" id="next">
</div>
View (in my case _Layout) - Ajax:查看(在我的情况下为 _Layout)- Ajax:
$("#next").click(function () {
GetData();
});
function GetData() {
var InputLogin = $('#email').val();
var InputPassword = $('#password').val();
$.ajax({
type: "POST",
url: 'Home/Logowanie',
data: {
email: InputLogin,
password: InputPassword,
first: false,
second: false,
},
success: function () { location.reload(); },
error: function () { alert('Error'); },
});
}
Controller (in my case HomeController): Controller(在我的情况下是 HomeController):
public async Task<IActionResult> Logowanie(string email, string password, bool first, bool second)
{
string returnUrl = null;
returnUrl = returnUrl ?? Url.Content("~/");
email = email.ToUpper();
if (ModelState.IsValid)
{
lockoutOnFailure: true
var user = await _userManager.FindByEmailAsync("adam@atma.com.pl");
var result = await _signInManager.PasswordSignInAsync(user, password,
first,second);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}
return Page();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.