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

要达到最初的设想,需在 Program.cs中启用认证中间件服务 : app.UseAuthentication(); 

同时给 builder.Services.AddAuthentication( ) 处理程序设置对应的方案,如下(红色部分代码):

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days.
    // You may want to change this for production scenarios,
    // see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
//app.UseAuthorization();

app.MapRazorPages();

app.Run();

编译后重新运行,在登录页面输入 admin/123 后运行结果如下:

可以看到用户已通过了认证,声明中的值也都打印出来了,至此,整个登录认证过程就完成了。

补充:前面提到“方案”这个词,对应的英文是 Scheme , 那么什么是方案呢?看微软官方文档是如何描述的:

身份验证方案及处理程序的功能在官方文档描述如下:

至于如何去自定义,后续再展开。

接下来,我们来看如何实现不同的角色访问不同的页面。

虽然前面实现了认证,能读取声明中的信息,但以admin的身份登录后是可以访问 UserIndex 页面的,反之亦然,要实现admin账号

只能访问adminmng目录下的页面,步骤如下: 

第1步:在Program.cs中启用授权中间件并设置无权限访问时要跳转的页面,本例中跳转到 Forbidden.cshtml ,代码件红色字体部分:

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
        //滑动过期
        options.SlidingExpiration = true;
        //滑动过期时间30分钟,即30分钟内没有访问页面就过期
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);    
        //无权限访问时跳转到的页面,Pages目录下要有Forbidden.cshtml页面
        options.AccessDeniedPath = "/forbidden";
    });

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days.
    // You may want to change this for production scenarios,
    // see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();//启用授权中间件
app.UseAuthorization(); 

app.MapRazorPages();

app.Run();
using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
        //滑动过期
        options.SlidingExpiration = true;
        //滑动过期时间30分钟,即30分钟内没有访问页面就过期
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);    
        //无权限访问时跳转到的页面,Pages目录下要有Forbidden.cshtml页面
        options.AccessDeniedPath = "/forbidden";
    });

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days.
    // You may want to change this for production scenarios,
    // see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
//启用授权中间件
app.UseAuthorization(); 

app.MapRazorPages();

app.Run();

第2步:在 Pages 目录下新增  Forbidden.cshtml ,页面代码如下:

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

<div>没有权限访问此页面!</div>

第3步:给要设置权限的页面 Model 增加Authorize特性,如下(见红色字体):

AdminIndex.cshtml.cs 页面如下:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages.AdminMng
{
    [Authorize(Roles ="AdminRole")]
    public class AdminIndexModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

UserIndex.cshtml.cs 页面如下:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages.UserMng
{
    [Authorize(Roles = "UserRole")]
    public class UserIndexModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

至此配置完毕, 最重要的是在登录声明中一定要包含  new Claim(ClaimTypes.Role, roleName)  语句 ! 

注意:和 WEBAPI 不同,RazorPages 的角色授权只能是整个页面(这里是UserIndexModel),不可以具体到页面中的某个方法, 

           而WebAPI既可以是Controller,也可以是Controller中的某个方法(Action)。 

解决方案目录如下:

编译后运行,访问以admin的账号登录,页面如下:

在浏览器的地址栏把网址改成 usermng/userindex 后按 enter 键 ,页面如下:

 可以看到:

1. 网址变成了  forbidden ,并且我们欲访问的页面 usermng/userindex  变成了查询参数 ReturnUrl 的值;

2. 显示了 Forbidden.cshtml 页面的值,这是我们在 Program.cs 的 AddCookie( ) 方法中设置的;

3. 按下 enter 键后访问的页面返回了  302 的状态码, 然后页面发生了跳转;

4. cookie 信息没有改变;

=================结束分割线==============

问题: 如果有一个页面 ,比如  Pages/Common/ModifyPassword.cshtml 只要登录用户都可以访问,不需要区分角色,该如何设置呢?

有2种方法:

其一:在 ModifyPassword.cshtml.cs 中增加 Authorize 特性且不要传递 Roles 属性值,如下(红色字体部分):

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages.Common
{
    [Authorize]
    public class ModifyPasswordModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

重新编译后清除cookie访问如下:

其二:在 program.cs 中增加 授权约定(authorization conventions) ,如下(红色字体部分):

 

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
        //滑动过期
        options.SlidingExpiration = true;
        //滑动过期时间30分钟,即30分钟内没有访问页面就过期
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);    
        //无权限访问时跳转到的页面,Pages目录下要有Forbidden.cshtml页面
        options.AccessDeniedPath = "/forbidden";
        //无认证时跳转的页面
        options.LoginPath = "/login";        
    });

// Add services to the container.
builder.Services.AddRazorPages(options => {
    //针对文件设置访问权限    
    options.Conventions.AuthorizePage("/Common/ModifyPasswrod");

    //针对文件夹设置访问权限
    //options.Conventions.AuthorizeFolder("/Common");

    //以下设置可以针对文件或文件夹取消访问权限验证
    //options.Conventions.AllowAnonymousToPage("/Common/ModifyPasswrod");
    //options.Conventions.AllowAnonymousToFolder("/Common");
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days.
    // You may want to change this for production scenarios,
    // see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

using Microsoft.AspNetCore.Authentication.Cookies;  var builder = WebApplication.CreateBuilder(args);  builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)     .AddCookie(options => {         //滑动过期         options.SlidingExpiration = true;         //滑动过期时间30分钟,即30分钟内没有访问页面就过期         options.ExpireTimeSpan = TimeSpan.FromMinutes(30);             //无权限访问时跳转到的页面,Pages目录下要有Forbidden.cshtml页面         options.AccessDeniedPath = "/forbidden";         //无认证时跳转的页面         options.LoginPath = "/login";             });  // Add services to the container. builder.Services.AddRazorPages(options => {     //针对文件设置访问权限         options.Conventions.AuthorizePage("/Common/ModifyPasswrod");      //针对文件夹设置访问权限     //options.Conventions.AuthorizeFolder("/Common");      //以下设置可以针对文件或文件夹取消访问权限验证     //options.Conventions.AllowAnonymousToPage("/Common/ModifyPasswrod");     //options.Conventions.AllowAnonymousToFolder("/Common"); });  var app = builder.Build();  // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) {     app.UseExceptionHandler("/Error");     // The default HSTS value is 30 days.     // You may want to change this for production scenarios,     // see https://aka.ms/aspnetcore-hsts.     app.UseHsts(); }  app.UseHttpsRedirection(); app.UseStaticFiles();  app.UseRouting();  app.UseAuthentication(); app.UseAuthorization();  app.MapRazorPages();  app.Run();

编译后访问,和第一种方式的效果相同。。。

  注意:文件夹和页面授权的包含关系如下:  

  * 先指定页面文件夹需要授权,然后指定该文件夹中的页面允许匿名访问,这样操作是有效的:  

  .AuthorizeFolder("/Common").AllowAnonymousToPage("/Common/XxxPage")   // 正确 !          

  * 不可以先为匿名访问声明页面文件夹,然后在该文件夹中指定需要授权的页面                           

  .AllowAnonymousToFolder("/Common").AuthorizePage("/Common/XxxPage")    // 错误!          

【完】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`app.UseAuthentication()` 和 `app.UseAuthorization()` 是在 ASP.NET Core 应用程序中配置身份验证和授权的中间件。 - `app.UseAuthentication()` 用于启用身份验证中间件,它会检查传入的请求中是否包含有效的身份验证凭据(如 JWT、Cookie 等),并将用户的身份信息设置到 `HttpContext.User` 属性中。这样,你就可以在后续的请求处理过程中方便地访问用户的身份信息。 - `app.UseAuthorization()` 用于启用授权中间件,它会根据配置的策略来验证用户是否具有访问资源的权限。通过配置不同的策略,你可以限制用户对某些特定资源的访问。如果用户没有满足所需策略的权限,将会收到 403 Forbidden 的响应。 这两个中间件通常在 `Configure` 方法中的管道配置中使用,并且顺序很重要。通常,`app.UseAuthentication()` 应该放在 `app.UseRouting()` 之后,而 `app.UseAuthorization()` 应该放在 `app.UseAuthentication()` 之后。这样可以确保身份验证在路由和授权之前进行。 ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 省略其他配置... app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 省略其他配置... } ``` 通过使用这两个中间件,你可以在 ASP.NET Core 应用程序中轻松地实现身份验证和授权的功能,以确保只有经过身份验证且具有适当权限的用户可以访问受保护的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值