本文记录最近使用ASP.net Core做Web应用服务时登录用到的技巧。
在一些场景下,客户可以浏览web应用中的一些页面且不写要登录,但客户需要进行某些操作时,此时到登录页面。比如我们浏览“知乎”时候可以不登录,如果需要进行评论,那么会跳转到登录页面。此时用户如果登录完成后直接跳转到首页而不是刚刚浏览的内容,那么体验会大大降低(也许再也找不到刚刚的帖子)。 那么我们怎么在登录后回到之前的页面呢?
asp.net core MVC中如果authorize验证不通过,会跳转到指定的页面(比如登录页面)。
首先我们注册服务指定无权限是跳转的方式如下:
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Login";
options.ExpireTimeSpan = new TimeSpan(0,3,0);
});
然后我们新建Account控制器并添加一个名为Login的Action,其中Login接收一个string的参数。
public class AccountController : Controller
{
private SignInManager<IdentityUser> signInManager;
public AccountController(SignInManager<IdentityUser> signIn)
{
signInManager = signIn;
}
[HttpGet]
[AllowAnonymous]
public IActionResult Login(string returnurl)
{
ViewBag.returnUrl = returnurl;
return View();
}
[HttpPost]
public async Task<IActionResult> Login(string name, string password, string returnurl)
{
Microsoft.AspNetCore.Identity.SignInResult result =
await signInManager.PasswordSignInAsync(name, password, true, false);
if (result.Succeeded)
{
return Redirect("/Home/Index");
}
else
{
ViewBag.returnUrl = returnurl;
ViewBag.Error = "用户名或密码错误!";
return View();
}
}
public async Task<IActionResult> LoginOut()
{
await signInManager.SignOutAsync();
return Redirect("/Account/Login");
}
}
当直接在浏览器中输入一个未授权的URL时(如:http://localhost:5001/Home/Index),Asp.net Core Mvc框架会自动帮我们跳转到Account/Login
并且传入参数为:“/Home/Index”,我们可以是用ViewBag记录,并绑定到formb表单的一个隐藏元素中,这样提交后就可以获得到。
最后附上上Razor的代码:
<form method="post" action="~/Account/Login">
<div class="login_padding" id="login_model">
<h2>用户名</h2>
<label>
<input type="text" id="name" name="name" class="txt_input txt_input2" onfocus="if (value =='Your name'){value =''}" onblur="if (value ==''){value='Your name'}" value="Your name">
</label>
<h2>密 码</h2>
<label>
<input type="password" name="password" id="password" class="txt_input" onfocus="if (value =='******'){value =''}" onblur="if (value ==''){value='******'}" value="******">
</label>
<input name="returnurl" value="@ViewBag.returnUrl" type="hidden" />
<div class="rem_sub">
<div class="rem_sub_l">
<p class="text-danger">@ViewBag.Error</p>
</div>
<label>
<input type="submit" class="sub_button" name="button" id="button" value="登 录" style="opacity: 0.7;">
</label>
</div>
</div>
</form>