认证
在安全领域,认证和授权是俩个重要的主题。认证是安全体系的第一道屏障,当访问者进入的时候认证体系通过验证对方提供的凭证票据确定其真实身份。认证体系只有在证实了访问者的真实身份的情况下才会允许进入。asp.net core 提供了多种认证方式(基于Cookie、JWT等等)。
asp.net core 采用的是基于“票据“的认证机制及在登陆时通过HttpContext.SignInAsync()方法将ClaimsPrincipal(类似身份证)对象以及一些过期时间等等加密后写入Cookie(仅Cookie认证模式),当页面请求进入时通过中间件app.UseAuthentication()进行认证,通过认证的解析出用户信息赋值给HttpContext.User(可以这么理解,但是实际上还涉及IIdentity IPrincipal Claim ClaimsIdentity 可以参考官方文档)这样进行授权鉴权时才能找的用户信息,也就是你登录时写入Cookice中的信息,这里顺便提一下授权鉴权使用的是app.UseAuthorization()他俩是亲兄弟长得有点像
下面展示部分使用配置代码:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = new PathString("/Fourth/Login"); options.AccessDeniedPath = new PathString("/Home/Privacy"); }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { app.UseSession(); app.UseHttpsRedirection(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot")) }); app.UseRouting(); app.UseAuthentication();//鉴权,检测有没有登录,登录的是谁,赋值给HttpContext.User app.UseAuthorization();//就是授权,检测权限 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
以上是Startup中配置部分
下面是登陆位置的部分代码
public async Task<ActionResult> Login(string name, string password) { ... //当帐号密码验证通过时 var claims = new List<Claim>() { new Claim(ClaimTypes.Name,name), new Claim(ClaimTypes.Role,"Admin"),//如果使用默认的权限管理此处不能自定义必须使用ClaimTypes.Role,ClaimTypes.Name 如果鉴权使用自定义策略 不做限制 new Claim("Account","Administrator")//可以随便加 }; var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer")); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(30), });//没用await }
使用时在需要授权的Action或者是控制器上加[Authorize]注解该类的命名空间是namespace Microsoft.AspNetCore.Authorization,如果加在控制器上内部有Action不需要授权可以使用[AllowAnonymous]
退出登陆使用context.SignOutAsync(),给方法重定向到Cookie方案中配置的默认页;
无权访问重定向可以使用context.ChallengeAsync(),该方法重定向到Cookie方案中配置的默认页