.NET 6.0 MVC使用Cookie进行身份验证

news/2024/9/27 20:10:33 标签: .net, mvc

一般而言MVC 是不与其他系统发生数据交互,所以使用Cookie验证即可,无需安装拓展。

1.Program里面注册服务

//1.选择使用那种方式来身份验证
builder.Services.AddAuthentication(option =>
{
    option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; //默认身份验证方案
    option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
{
    option.LoginPath = "/Login/Login";//如果没有找到用户信息---身份验证失败--授权也失败了---就跳转到指定的Action
    option.LogoutPath = "/Login/Logout";//登出跳转
    option.AccessDeniedPath = "/Login/Login";//身份验证失败页面
    //option.Events.OnRedirectToLogin = context =>
    //{
    //    //context.Response.StatusCode = 302; // 设置302重定向状态码
    //    //context.Response.Headers["Location"] = "/Login/Login"; // 重定向到登录页
    //    //context.Response.Redirect(context.RedirectUri);
    //    return Task.CompletedTask;
    //};
});






//2)在 app.UseAuthorization() 代码上添加 UseAuthentication 即 身份验证中间件,
app.UseAuthentication();//身份验证中间件,必须在前
app.UseAuthorization();//授权中间件

2.在用户登录时给添加身份(LoginModel 只是我的接收参数的类,此处改为自己的即可)

public async Task<IActionResult> LoginAction([FromBody] LoginModel model)
{
//.....身份验证逻辑
//.....
//验证成功,创建身份信息
    var claims = new List<Claim>()//身份验证信息
{
    new Claim(ClaimTypes.Name,$"{model.Account}"),//用户传过来的账号
    new Claim(ClaimTypes.Role,model.RoleName),用户传过来的角色,最好根据账号从数据库查询,用于授权
    new Claim("PassWord",model.PassWord),//用户传过来的密码
    new Claim("RoleId",RoleId),//可以写入任意数据
};

//通过Claim来创建ClaimsIdentity 类似于通过用户的身份来创建身份证
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    //应该允许刷新身份验证会话。
    AllowRefresh = true,
    //身份验证票证过期的时间10分钟
    ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30),
    //允许持久化
    IsPersistent = true,
    //cookie过期时间1天
    IssuedUtc = DateTime.Now.AddDays(1),
    重定向url地址
    //RedirectUri = "/Login/Login"
};

//授权cookie
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);

var result = new
{
    success = true,
    msg = "登录成功",//消息
};
return Json(result);
}

用户退出登录

  /// <summary>
  /// 退出
  /// </summary>
  /// <returns></returns>
  public async Task<IActionResult> Logout()
  {
      await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
      return RedirectToAction("Login");
  }

获取用户信息:

/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
//[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
public string GetUser()
{
    try
    {
        if (HttpContext.User.Identity != null)
        {
            if (HttpContext.User.Identity.IsAuthenticated)  //判断用户是否通过认证
            {
                string name = HttpContext.User.Claims.ToList()[0].Value;
                return name;
            }
            else
            {
                return "未登录";
            }
        }
        return "无权访问";
    }
    catch (Exception ex)
    {

        return "欢迎";
    }
}

授权使用方法(注:三种授权方式(Policy、Role、Scheme),这里是通过角色授权):

[Authorize(Roles = "SysAdmin,UserAdmin,RoleAdmin")]//只有角色为SysAdmin,UserAdmin,RoleAdmin其中一个的可访问该控制器
public class RoleController : Controller//你的控制器
{
/// <summary>
/// 用户管理
/// </summary>
/// <returns></returns>
[Authorize(Roles = "SysAdmin,UserAdmin")]//Authorize不传参数的话代表只要验证成功就可访问控制器,容易造成垂直越权行为
public IActionResult UserManager()
{
    return View();
}
}


http://www.niftyadmin.cn/n/5679444.html

相关文章

Java:整数操作

目录 1、Long类型转化为Int类型 1、Long类型转化为Int类型 Math.toIntExact() 是 Java 8 引入的一个方法&#xff0c;它可以将 long 类型的值转换为 int 类型的值&#xff0c;并在转换过程中进行溢出检查。如果 long 类型的值超出了 int 类型的范围&#xff08;即小于 -2,147,4…

国产数据库盘点-亚信安慧AntDB独立模式部署

本章节主要介绍 AntDB 集中式独立模式部署&#xff0c;主要分两步&#xff1a; 安装数据库&#xff08;二进制文件&#xff09; 数据库初始化 安装数据库 以 AntDB 7.2 版本的安装包 antdb-t-ee-release-7.2.generic.* 举例。 将安装包&#xff08;antdb-t-ee-release-7.2…

从GPS接收机灵敏度出发--理论计算GPS最低的跟踪灵敏度

思博伦售后团队 对射频工程师来说&#xff0c;自己设计的接收机灵敏度&#xff08;Receiver Sensitivity&#xff09;是最关注也是最重要的参数之一。所以我们首先来看看接收机灵敏度的定义&#xff1a; 在满足一定误码率的条件下&#xff0c;接收机能容许接受到的最小信号电平…

DK5V100R10SL贴片TO252功率12V4.3A同步整流芯片

概述DK5V100R10SL是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个功能引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机效率&#xff0c;取代或替换目前市场上等规的…

C++之STL—常用排序算法

sort (iterator beg, iterator end, _Pred) // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…

汽车信息安全 -- 存到HSM中的密钥还需包裹吗?

目录 1.车规芯片的ROM_KEY 2.密钥加密与包裹 3.瑞萨RZ\T2M的密钥导入 4.小结 在车控类ECU中&#xff0c;我们通常把主控芯片MCU中的HSM以及HSM固件统一看做整个系统安全架构的信任根。 所以大家默认在HSM内部存储的数据等都是可信的&#xff0c;例如CycurHSM方案中使用HSM…

RestSharp简介

RestSharp是一个轻量级HTTP客户端库&#xff0c;主要功能是通过HTTP对远程资源进行同步异步调用&#xff0c;可将请求主体序列化为JSON或XML并反序列化相应。 请求主体的方式&#xff1a;JSON、XML和表单数据 参数类型&#xff1a;查询、URL段、标头、cookie、正文 官方的例…

【Redis】集群槽设计原理

在 Redis 中, 为了支持高可用, 官方提供了 3 种方式 主从复制哨兵模式集群模式 (Cluster) 但是主从复制和哨兵模式都有一个问题: 无法水平扩缩容, 而这个问题在集群模式中得到了解决。 假设有 3 个 Redis 节点, 所有的数据均匀的分散在 3 个节点中。 如果现在需要往里面加入一…