找回密码
 会员注册
查看: 134|回复: 0

Asp.Net Core 实现登录验证身份的功能

[复制链接]

1389

主题

5

回帖

496万

积分

管理员

积分
4962988
发表于 2024-2-29 08:29:26 | 显示全部楼层 |阅读模式

步骤如下:

1.打开VS2019,新建ASP.NET Core Web应用程序,选择Web应用程序(模型视图控制器)

 

 

不用勾选右侧的身份认证,因为演示的是比较简单的,而勾选之后模板内容较为复杂

 

2、在Controller文件夹下AccountController,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Claims;
  5. using System.Threading.Tasks;
  6. using Microsoft.AspNetCore.Authentication;
  7. using Microsoft.AspNetCore.Authentication.Cookies;
  8. using Microsoft.AspNetCore.Authorization;
  9. using Microsoft.AspNetCore.Mvc;
  10. namespace Server.Controllers
  11. {
  12. public class AccountController: Controller
  13. {
  14. /// <summary>
  15. /// 登录页面
  16. /// </summary>
  17. /// <returns></returns>
  18. public IActionResult Login()
  19. {
  20. return View();
  21. }
  22. /// <summary>
  23. /// post 登录请求
  24. /// </summary>
  25. /// <returns></returns>
  26. [HttpPost]
  27. public async Task<IActionResult> Login(string userName, string password)
  28. {
  29. if (userName.Equals("admin") && password.Equals("123456"))
  30. {
  31. var claims = new List<Claim>(){
  32. new Claim(ClaimTypes.Name,userName),new Claim("password",password)
  33. };
  34. var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer"));
  35. await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new AuthenticationProperties
  36. {
  37. ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
  38. IsPersistent = false,
  39. AllowRefresh = false
  40. });
  41. return Redirect("/Home/Index");
  42. }
  43. return Json(new { result = false, msg = "用户名密码错误!" });
  44. }
  45. /// <summary>
  46. /// 退出登录
  47. /// </summary>
  48. /// <returns></returns>
  49. public async Task<IActionResult> Logout()
  50. {
  51. await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
  52. return Redirect("/Login");
  53. }
  54. }
  55. }
复制代码

 

3.在Views文件夹下新建一个Account的文件夹,并在文件夹中新建Login.cshtml,实现登录页面的html视图

内容如下:

  1. @{
  2. ViewData["Title"] = "登录";
  3. }
  4. <h2 style="text-align:center">登录管理系统</h2>
  5. <hr />
  6. <div>
  7. <form asp-controller="Account" asp-action="Login" method="post">
  8. <div>
  9. <label class="control-label">用户名</label>
  10. <input class="form-control" type="text" name="username"/>
  11. </div>
  12. <div>
  13. <label class="control-label">密码</label>
  14. <input class="form-control" type="password" name="password" />
  15. </div>
  16. <div class="form-group">
  17. <input type="submit" value="登录" class="btn btn-primary" />
  18. </div>
  19. </form>
  20. </div>
  21. @section Scripts {
  22. @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
  23. }
复制代码

 

 

4.修改Startup.cs文件内容,将身份认证中间件添加到容器中

在public void ConfigureServices(IServiceCollection services)方法中加入如下内容:

  1. services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  2. .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
  3. {
  4. //登录路径:这是当用户试图访问资源但未经过身份验证时,程序将会将请求重定向到这个相对路径
  5. o.LoginPath = new PathString("/Account/Login");
  6. //禁止访问路径:当用户试图访问资源时,但未通过该资源的任何授权策略,请求将被重定向到这个相对路径。
  7. o.AccessDeniedPath = new PathString("/Home/Privacy");
  8. });
复制代码

在public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env) 方法中加入:

  1. app.UseAuthentication();//认证//身份验证中间件
  2. 注意这句话要放在app.UseMvc的前面
复制代码

 

 

 

5.F5运行项目,然后在浏览器中输入:

https://localhost:5000/Account/Login,访问登录界面

 

输入账号密码后,点击登录,则会进入AccountController的post Login方法,进行验证,若验证成功,则会调用HttpContext.SignInAsync 方法给浏览器发送一个cookie的认证信息

这样用户就可以在其他页面中使用该认证信息进行访问了

 

6.如何控制呢?

通过注解[Authorize] ,在所有需要用户登录的Controller上方加上[Authorize]注解,那么由于在startup中注册过的原因,若发现用户没有认证信息,则会跳转到Account/Login 登录页面要求登录

 

由于已经在Controller上方加过[Authorize],因此这个Controller中所有的方法都会要求验证,如果在该Controller中又有一个get api,我们想让其不需要验证就可以访问,那么可以在该方法上方加上[AllowAnonymous],如:

  1. [AllowAnonymous]
  2. [HttpGet]
  3. [Route("/info")]
  4. public ActionResult<string> Get()
  5. {
  6. return serviceImpl.getDataAll();
  7. }
复制代码

 

同理[AllowAnonymous]也可以加在Controller上方

 

这样就实现了.netCore 简单的身份验证以及登录功能


来源:https://blog.csdn.net/wcc27857285/article/details/100090071
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?会员注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 00:24 , Processed in 0.351664 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表