文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式(示例详解)

2024-04-02 19:55

关注

在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况。asp.core 同样支持两种兼容。

首先在startup.cs 启用身份验证。

var secrityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]));
            services.AddSingleton(secrityKey);
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(option =>    //cookies 方式
                {
                    option.LoginPath = "/Login"; 
                })
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>   //jwt 方式
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,//是否验证Issuer
                    ValidateAudience = true,//是否验证Audience
                    ValidateLifetime = true,//是否验证失效时间
                    ClockSkew = TimeSpan.FromSeconds(30),
                    ValidateIssuerSigningKey = true,//是否验证SecurityKey
                    ValidAudience = Configuration["JWTDomain"],//Audience
                    ValidIssuer = Configuration["JWTDomain"],//Issuer
                    IssuerSigningKey = secrityKey//拿到SecurityKey
                };
            });

Configure 方法中须加入

app.UseAuthentication(); //授权
  app.UseAuthorization(); //认证 认证方式有用户名密码认证

            app.MapWhen(context =>
            {
                var excludeUrl = new string[] { "/api/login/getinfo", "/api/login/login", "/api/login/modifypwd" };  //注意小写
                return context.Request.Path.HasValue
                && context.Request.Path.Value.Contains("Login")
                && context.Request.Headers.ContainsKey("Authorization")
                && !(excludeUrl.Contains(context.Request.Path.Value.ToLower()));
            }, _app =>
            {
                _app.Use(async (context, next) =>
                {
                    context.Response.StatusCode = 401;
                });
            });

在login页面,后台代码

var uid = Request.Form["code"] + "";
var pwd = Request.Form["pwd"] + "";
 
var info = _mysql.users.Where(m => m.user_code == uid&&m.delflag==0).FirstOrDefault();
if (info == null)
{
    return new JsonResult(new
    {
        success = false,
        msg = "用户不存在"
    });
}
if (info.pwd != pwd)
        msg = "用户密码不正确"
//创建一个身份认证
var claims = new List<Claim>() {
            new Claim(ClaimTypes.Sid,info.id), //用户ID
            new Claim(ClaimTypes.Name,info.user_code)  //用户名称
        };
var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);
//var identity = new ClaimsIdentity(claims, "Login");
//var userPrincipal = new ClaimsPrincipal(identity);
//HttpContext.SignInAsync("MyCookieAuthenticationScheme", userPrincipal, new AuthenticationProperties
//{
//    ExpiresUtc = DateTime.UtcNow.AddMinutes(30),
//    IsPersistent = true
//}).Wait();
var authProperties = new AuthenticationProperties
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.
    ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60),
    // The time at which the authentication ticket expires. A
    // value set here overrides the ExpireTimeSpan option of
    // CookieAuthenticationOptions set with AddCookie.
    IsPersistent = true,
    // Whether the authentication session is persisted across
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.
    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.
    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http
    // redirect response value.
};
await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    authProperties);

 Controler控制器部分,登录代码:

[HttpPost("Login")]
        public async Task<JsonResult> Login(getdata _getdata)
        {
            var userName = _getdata.username;
            var passWord = _getdata.password;
            var info = _mysql.users.Where(m => m.user_code == userName && m.delflag == 0).FirstOrDefault();
            if (info == null)
            {
                return new JsonResult(new
                {
                    state = false,
                    code = -1,
                    data = "",
                    msg = "用户名不存在!"
                });
            }
            if (CommonOp.MD5Hash(info.pwd).ToLower() != passWord)
                    code = -2,
                    msg = "用户密码不正确!"
 
            #region 身份认证处理
            var secrityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["SecurityKey"]));
            List<Claim> claims = new List<Claim>();
            claims.Add(new Claim("user_code", info.user_code));
            claims.Add(new Claim("id", info.id));
            var creds = new SigningCredentials(secrityKey, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: _config["JWTDomain"],
                audience: _config["JWTDomain"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(120),
                signingCredentials: creds);
            return new JsonResult(new
                state = true,
                code = 0,
                data = new JwtSecurityTokenHandler().WriteToken(token),
                msg = "获取token成功"
            });
            #endregion
        }

注意, 受身份验证的控制器部分,要加入如下属性头,才可以生效。


[Authorize(AuthenticationSchemes = "Bearer,Cookies")]
    public class ControllerCommonBase : ControllerBase
    {
     
     }  

这样一个Controler 控制器,能够兼容两种模式啦。

到此这篇关于asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式的文章就介绍到这了,更多相关asp.core 身份验证内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯