TNBLOG
首页
博客
视频
资源
问答
猿趣
手机
关于
搜索
收藏
便签
笔记
消息
创作
登录
忆点点
情不知从何起,一往而情深
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net
35篇
.net core
15篇
cdn
1篇
云服务
1篇
前端
72篇
后端
6篇
随笔
19篇
架构
1篇
linux
6篇
git
3篇
virtualbox
1篇
app
1篇
英语
4篇
redis
4篇
docker
4篇
更多
mysql
6篇
sqlsugar
4篇
uni_app
4篇
数据库
1篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术
转
ASP.NET Core 3.1 自定义登录认证过滤器
4342
人阅读
2020/12/8 20:33
总访问:
795513
评论:
0
收藏:
0
手机
分类:
.net core
原文 [ASP.NET Core 3.1 自定义登录认证过滤器](https://blog.csdn.net/weixin_42331508/article/details/108105091) 自定义一个认证过滤器,没有登录不允许访问。 过滤器是全局的,也就是说不用在每个控制器上加标签,如果有控制器不需要认证,加[AllowAnonymous]标签就行。 用户名和密码提交到这个Action,用于登录。 LoginConroller.cs ``` [AllowAnonymous]//访问这个action不需要登录 [HttpPost] public async Task<IActionResult> RequestLogin(Users users) { var user = _context.Users.Where(m => m.Name == users.Name && m.PassWord == users.PassWord).FirstOrDefault();//假装从数据库中取用户信息 if (user == null) { return Json(new { code = 200, msg = "账号密码错误" }); } //一个claim 把它想作一对key和value。 new Claim(Key, Value), var claims = new List<Claim>() { new Claim(ClaimTypes.Name, user.Name), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()) }; //ClaimsIdentity 把它想作一个身份证 var indentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); //ClaimsPrincipal表示一个人,把身份证给这个人 var principal = new ClaimsPrincipal(indentity); //登录,写入cookie 把这个人传进去 await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal); return RedirectToAction("Index", "Home", _context.EnterAndLeaves.ToList()); } ``` 然后登录了之后就有了Cookie存在浏览器中,还需要过滤器 新建一个类AuthenFilterAttribute .cs ``` namespace CeWenAdmin.Filter { public class AuthenFilterAttribute : IAuthorizationFilter { //每个action执行之前都会进入这个方法 public void OnAuthorization(AuthorizationFilterContext context) { //如果不通过认证 重定向到/Login/User页 if (context.HttpContext.User.Identity.IsAuthenticated || HasAllowAnonymous(context)==true) return; context.Result = new RedirectToActionResult("Login", "User",null); } //用于判断Action有没有AllowAnonymous标签,微软写的 private bool HasAllowAnonymous(AuthorizationFilterContext context) { var filters = context.Filters; for (var i = 0; i < filters.Count; i++) { if (filters[i] is IAllowAnonymousFilter) { return true; } } var endpoint = context.HttpContext.GetEndpoint(); if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null) { return true; } return false; } } } ``` Startup.cs 一些配置 ``` public void ConfigureServices(IServiceCollection services) { //添加过滤器 services.AddControllersWithViews(option=> { option.Filters.Add(typeof(AuthenFilterAttribute)); }); .... //配置authorrize services.AddAuthentication(b => { b.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; b.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; b.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; }).AddCookie(b => { b.LoginPath = "/User/Login"; b.Cookie.Name = "msc_auth_name"; b.Cookie.Path = "/"; b.Cookie.HttpOnly = true; b.ExpireTimeSpan = TimeSpan.FromHours(5); }); .... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ .... app.UseAuthentication(); app.UseAuthorization(); ... } ```
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}