.net core 基于Claim登录验证

网站,首先需要安全,实现安全就必须使用登录验证,.net core 基于Claim登录验证就很简单使用。

Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,然后Claim组成一个ClaimIdentity 就是组成一个身份证。

那么我们.net core 是如何基于Claim实现登录验证呢

首先我们需要在startup中配置:

        public void ConfigureServices(IServiceCollection services)
        {           
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                  .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
                  {
                      o.LoginPath = new PathString("/Login"); // 登录页面的url
                      o.AccessDeniedPath = new PathString("/Login");//没有授权跳转的页面
                      o.ExpireTimeSpan = TimeSpan.FromHours(0.5); // cookies的过期时间
                  });
}
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseAuthentication();   //添加中间件
        }

然后我们需要在我们的登录用户名和密码的表中添加这个字段

        /// <summary>
        /// 属性标识此身份验证模块实现的身份验证类型
        /// </summary>
        public string AuthenticationType { get; internal set; }

然后我们在登录的控制器写登录方法

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="name">用户名</param>
        /// <param name="password">密码</param>
        /// <returns></returns>
        [HttpGet("login/{name}/{password}")]
        public async Task<IActionResult> Login(string name, string password)
        {
            var user = userLogicHandler.GetUsers(name, password);
            if (user !=null)
            {
                user.AuthenticationType = CookieAuthenticationDefaults.AuthenticationScheme;
                var identity = new ClaimsIdentity(user.AuthenticationType);
                identity.AddClaim(new Claim(ClaimTypes.Name, user.UserId));
                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
                return Ok(200);
            }
            else
            {
                return Ok(500);
            }
        }

登录的时候上传密码和名称到服务器中,如果匹配,那么服务器会将ClaimsIdentity保存到客户端中的cookies中,然后每次请求需要验证的控制器的时候就会验证是否有ClaimIdentity。

    [Hidden]
    [Route("Home")]
    [Authorize]
    public class HomeController : Controller
    {
        /// <summary>
        /// 主界面
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Home()
        {
            return View();
        }

如上,加上[Authorize] 特性之后,每次请求该控制器的方法都会验证。

基于Claim的登录验证就是这些,如果有错误请指正。

转载于:https://www.cnblogs.com/Ivan-Wu/p/10711288.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的ASP.NET Core JWT鉴权授权的demo,可以作为参考: Startup.cs文件: ```csharp using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; namespace JwtDemo { public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) }; }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } } ``` HomeController.cs文件: ```csharp using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; namespace JwtDemo.Controllers { public class HomeController : Controller { private readonly IConfiguration _configuration; public HomeController(IConfiguration configuration) { _configuration = configuration; } public IActionResult Index() { return View(); } [HttpPost] public IActionResult Login(string username, string password) { if (username == "admin" && password == "password") { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64), new Claim(ClaimTypes.Role, "Admin") }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], claims: claims, expires: DateTime.UtcNow.AddMinutes(30), signingCredentials: creds); var response = new { token = new JwtSecurityTokenHandler().WriteToken(token) }; return Ok(response); } return BadRequest(); } [Authorize(Roles = "Admin")] public IActionResult Secret() { return Ok("You have access to this action because you are an Admin!"); } } } ``` appsettings.json文件: ```json { "Jwt": { "Issuer": "https://localhost:44363", "Audience": "https://localhost:44363", "SecretKey": "your secret key" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } } } ``` 在以上示例中,我们定义了一个Login方法用于生成JWT,并将其作为响应返回给客户端。我们还定义了一个Secret方法,并添加了Authorize特性,指定需要验证的角色为Admin。当客户端请求该方法时,ASP.NET Core会自动进行JWT验证,并根据角色信息进行授权。 示例中的SecretKey为示例密钥,实际应用中应使用更加安全的密钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值