本文记录最近使用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 ==&#39;Your name&#39;){value =&#39;&#39;}" onblur="if (value ==&#39;&#39;){value=&#39;Your name&#39;}" value="Your name">
	    </label>
	    <h2>密&nbsp;&nbsp;码</h2>
	    <label>
	        <input type="password" name="password" id="password" class="txt_input" onfocus="if (value ==&#39;******&#39;){value =&#39;&#39;}" onblur="if (value ==&#39;&#39;){value=&#39;******&#39;}" 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>