ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NET6完整项目实战系列第4篇:用户登录番外篇--app.UseAuthentication()和app.UseAuthorization()的使用(中)

2022-07-06 18:00:30  阅读:214  来源: 互联网

标签:Claim string -- app cshtml cs using Login UseAuthorization


在运行之前,先将Program.cs中唯一和认证授权有关的语句 app.UseAuthorization(); 注释起来,如下:

然后对 Login.cshtml 和 Login.cshtml.cs 文件中做少少改动,增加账号密码的非空校验,最后将登录信息写入cookie中,

编码如下:

Login.cshtml 

@page
@model WebApplication1.Pages.LoginModel
@{
}

<div style="color:red;">@Model.ErrorMsg</div>
<br />

<form method="post">
    账号:<input type="text" name="acc" /> <br /><br />
    密码:<input type="text" name="pwd" /> <br /><br />
    <input type="submit" name="send" value="确定" />
</form>

 @Model.ErrorMsg 中 ErrorMsg 是 Login.cshtml.cs 的一个字段,用来记录错误信息 。

Login.cshtml.cs

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Security.Claims;

namespace WebApplication1.Pages
{
    public class LoginModel : PageModel
    {
        public void OnGet()
        {
        }


        public string ErrorMsg = string.Empty;
        public async Task<IActionResult> OnPostAsync()
        { 
            string acc = Request.Form["acc"];
            string pwd = Request.Form["pwd"];

            if (string.IsNullOrWhiteSpace(acc) || string.IsNullOrWhiteSpace(pwd))
            {
                ErrorMsg = "账号或密码不能为空!";
                return Page();
            }
             
            string roleName = acc == "admin" ? "" : "";
            string url = acc == "admin" ? "adminmng/adminindex" : "usermng/userindex";
            //1. 声明
            List<Claim> claims = new()
            {
                new Claim(ClaimTypes.Name, acc), 
                new Claim(ClaimTypes.Role, roleName),
                new Claim("UserName", "张先生"),
            };           
            //2. 标识
            ClaimsIdentity identity = new (claims, CookieAuthenticationDefaults.AuthenticationScheme);             
            //3. 主体
            ClaimsPrincipal principal = new(identity);

            //4. 写入cookie
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
             
            return Redirect(url); 
        }


    }
}

 说明:

1.因为 Login.cshtml 页面是  POST 提交,所以 Login.cshtml.cs 中对应的处理方法是  OnPost( ) , 这是 net6 的规则  。

2.  HttpContext.SignInAsync( ) 是异步方法,前面要加 await 关键字,对应的  OnPost( ) 方法签名要加  async  关键字,

且返回值类型 IActionResult 必须是 Task<T> 的泛型类型。

3. 认证过程很简单,4步即可。

---ClaimsIdentity表示标识,身份证、护照 、驾驶证、火车票 就是4种不同的 ClaimsIdentity 。

---Claim 是标识中的声明,每种ClaimsIdentity都有相应的Claim, 

              身份证中的Claim包含  姓名、民族、性别、编号等信息;

              驾驶证中的Claim包含  姓名、性别、准驾车型、有效期 等信息;

              火车票中的Claim包含 车次、乘车日期、始发站、终点站 等信息;

---ClaimsPrincipal 表示认证主体,一个主体可以包含多个标识 ClaimsIdentity,比如我们坐高铁时就需要同时检查身份证和火车票 ;

4. CookieAuthenticationDefaults.AuthenticationScheme 是方案名称,每个方案有相应的认证处理程序,处理程序也可以自定义。

我们运行WEB应用后点 “登录” 连接,然后点确定,得到如下结果:

输入 admin/123 后点确定按钮得到如下页面:

错误提示 :  没有注册认证处理程序 ,按提示添加如下代码:

重新编译后运行,打开浏览器的开发人员工具查看,没有cookie消息(这里的Cookie不是login.cshtml.cs中设置的,

而是防止请求伪造 (XSRF/CSRF) 攻击用的,这一点以后再讲):

输入 admin/123  后查看 cookie 信息如下:

在 adminindex.cshtml 中增加读取认证信息代码如下:

@page
@using System.Security.Claims
@model WebApplication1.Pages.AdminMng.AdminIndexModel
@{
}


<span>Admin首页,用户是否认证 : </span>
<span>@HttpContext.User.Identity?.IsAuthenticated</span>

@foreach(Claim item  in HttpContext.User.Claims)
{
    <div>声明 @item.Type  值 @item.Value</div><br /><br />
}

重新编译后刷新页面如下:

可以看到并没有如我们期望的那样显示 True,也没有显示 Claim 中的信息 ,  接下来轮到 app.UseAuthentication( )  和 app.UseAuthorization(  ) 出场了。

 

标签:Claim,string,--,app,cshtml,cs,using,Login,UseAuthorization
来源: https://www.cnblogs.com/pfm33/p/16450348.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有