ASP.NET Core 鉴权授权三(添加自定义授权策略)

这篇具有很好参考价值的文章主要介绍了ASP.NET Core 鉴权授权三(添加自定义授权策略)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Program.cs

#region 授权
builder.Services.AddAuthorization(option =>
{
    //添加自定义授权策略
    option.AddPolicy("MyPolicy",p => p.RequireClaim(ClaimTypes.NameIdentifier,"1"));
});
#endregion

TestController.cs 应用自定义授权策略

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize("MyPolicy")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

TokenAuthenticationHandler.cs

    public Task<AuthenticateResult> AuthenticateAsync()
    {
        string token = _context.Request.Headers["Authorization"];
        if (token == "test")
        {
            ClaimsIdentity identity = new ClaimsIdentity("Ctm");
            identity.AddClaims(new List<Claim>(){
                new Claim(ClaimTypes.Name,"admin"),
                new Claim(ClaimTypes.NameIdentifier,"6")
            });
            var claimsPrincipal = new ClaimsPrincipal(identity);
            return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
        }
        return Task.FromResult(AuthenticateResult.Fail("token错误,请重新登录"));
    }
    /// <summary>
    /// 没有权限访问
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ForbidAsync(AuthenticationProperties? properties)
    {
        _context.Response.StatusCode = 403;
        return Task.CompletedTask;
    }

此处鉴权给的值是6,授权用的1,尝试访问
ASP.NET Core 鉴权授权三(添加自定义授权策略)

重要概念

基于策略的授权中有一个很重要的概念是Requirements,每一个Requirement都代表一个授权条件。
Requirement需要继承接口IAuthorizationRequirement。

已经内置了一些常用的实现:
AssertionRequirement :使用最原始的断言形式来声明授权策略。

DenyAnonymousAuthorizationRequirement :用于表示禁止匿名用户访问的授权策略,并在AuthorizationOptions中将其设置为默认策略。

ClaimsAuthorizationRequirement :用于表示判断Cliams中是否包含预期的Claims的授权策略。

RolesAuthorizationRequirement :用于表示使用ClaimsPrincipal.IsInRole来判断是否包含预期的Role的授权策略。

NameAuthorizationRequirement:用于表示使用ClaimsPrincipal.Identities.Name来判断是否包含预期的Name的授权策略。

OperationAuthorizationRequirement:用于表示基于操作的授权策略。

当内置的Requirement不能满足需求时,可以定义自己的Requirement.

自定义Requirement

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
});

MyAuthorizationHandler.cs

public class MyAuthorizationHandler : AuthorizationHandler<MyAuthorizationHandler>, IAuthorizationRequirement
{
    private readonly string _userId;
    public MyAuthorizationHandler(string userId)
    {
        _userId = userId;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyAuthorizationHandler requirement)
    {
        if (context.User.HasClaim(c => c.Type == ClaimTypes.NameIdentifier)
        && context.User.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.NameIdentifier)).Value == _userId)
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}

多授权方案

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
    option.AddPolicy("MyPolicy1", p => p.Requirements.Add(new MyAuthorizationHandler1("admin")));
});

MyAuthorizationHandler1.cs

public class MyAuthorizationHandler1 : AuthorizationHandler<MyAuthorizationHandler1>, IAuthorizationRequirement
{
    private readonly string _userName;
    public MyAuthorizationHandler1(string userName)
    {
        _userName = userName;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyAuthorizationHandler1 requirement)
    {
        if (context.User.HasClaim(c => c.Type == ClaimTypes.Name)
        && context.User.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.Name)).Value == _userName)
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}

TestController.cs

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize(Policy = "MyPolicy")]
    [Authorize(Policy = "MyPolicy1")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

鉴权方案 TokenAuthenticationHandler.cs

public class TokenAuthenticationHandler : IAuthenticationHandler
{
    private AuthenticationScheme _scheme;
    private HttpContext _context;
    /// <summary>
    /// 鉴权初始化
    /// </summary>
    /// <param name="scheme">鉴权架构名称</param>
    /// <param name="context">HttpContext</param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
    {
        _scheme = scheme;
        _context = context;
        return Task.CompletedTask;
    }
    public Task<AuthenticateResult> AuthenticateAsync()
    {
        string token = _context.Request.Headers["Authorization"];
        if (token == "test")
        {
            ClaimsIdentity identity = new ClaimsIdentity("Ctm");
            identity.AddClaims(new List<Claim>(){
                new Claim(ClaimTypes.Name,"admin"),
                new Claim(ClaimTypes.NameIdentifier,"1")
            });
            var claimsPrincipal = new ClaimsPrincipal(identity);
            return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
        }
        return Task.FromResult(AuthenticateResult.Fail("token错误,请重新登录"));
    }

    /// <summary>
    /// 未登录
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ChallengeAsync(AuthenticationProperties? properties)
    {
        _context.Response.Redirect("/api/Login/NoLogin");
        return Task.CompletedTask;
    }

    /// <summary>
    /// 没有权限访问
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ForbidAsync(AuthenticationProperties? properties)
    {
        _context.Response.StatusCode = 403;
        return Task.CompletedTask;
    }
}

多授权方案,每个授权策略都需要通过
那么也可以使用多鉴权架构,Cookie可用于web浏览器,token用于终端API调用

改造效果:文章来源地址https://www.toymoban.com/news/detail-772384.html

多鉴权方案

Program.cs

//注册鉴权架构
#region Cookie
builder.Services.AddAuthentication("Cookies").AddCookie(o =>{
    o.LoginPath = "/api/Login/NoLogin";
});

#region  自定义Token验证
builder.Services.AddAuthentication(option =>
{
    //把自定义的鉴权方案添加到鉴权架构中
    option.AddScheme<TokenAuthenticationHandler>("token", "myToken");
    option.DefaultAuthenticateScheme = "token";
    option.DefaultChallengeScheme = "token";
    option.DefaultForbidScheme = "token";
});
#endregion
#endregion


#region 授权
// builder.Services.AddAuthorization(option =>
// {
//     option.AddPolicy("MyPolicy",p => p.RequireClaim(ClaimTypes.NameIdentifier,"1"));
// });

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
    // option.AddPolicy("MyPolicy1", p => p.Requirements.Add(new MyAuthorizationHandler1("admin")));
});
#endregion

TestController.cs

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize(Policy = "MyPolicy",AuthenticationSchemes = $"token,Cookies")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

授权绑定鉴权

//注册鉴权架构
#region Cookie
builder.Services.AddAuthentication("Cookies").AddCookie(o =>{
    o.LoginPath = "/api/Login/NoLogin";
});

#region  自定义Token验证
builder.Services.AddAuthentication(option =>
{
    //把自定义的鉴权方案添加到鉴权架构中
    option.AddScheme<TokenAuthenticationHandler>("token", "myToken");
    //option.DefaultAuthenticateScheme = "token";
    option.DefaultChallengeScheme = "token";
    option.DefaultForbidScheme = "token";
});
#endregion
#endregion
builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p =>p.AddAuthenticationSchemes("token").Requirements.Add(new MyAuthorizationHandler("1")));
    option.AddPolicy("MyPolicy1", p =>p.AddAuthenticationSchemes("Cookies").Requirements.Add(new MyAuthorizationHandler1("admin")));
});

到了这里,关于ASP.NET Core 鉴权授权三(添加自定义授权策略)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core 授权二(自定义token)

    首先自定义一个类TokenAuthenticationHandler,然后需要继承IAuthenticationHandler接口 具体代码: 后续需要鉴权的接口,在请求上都需要加上Authorization参数 Claim:相当于一个身份单元,存储着键值信息 ClaimsIdentity:身份证,身份单元的集合(可以理解为身份证上有多个身份单元) Clai

    2024年02月03日
    浏览(41)
  • .Net Core Jwt鉴权授权

    目录 简介 基于.Net Core 验证方式 Jwt获取Token 引入三方包 生成Token UserInfo JwtConfig WebApi测试(获取Token) Program.cs appsetting.json Controller .Net Core 验证(webApi) Progarm.cs Contorller .Net Core 授权 简介 Program.cs JwtAuthorization.cs 注意 Autofac 注册授权服务 Controller 注意 jwt触发委托 Jwt分为三段 通过远

    2024年02月13日
    浏览(33)
  • ASP.NET CORE WEBAPI 登录 JWT 鉴权 ,接口权限验证

    介绍 当今Web开发中,API的使用越来越广泛,而API的安全性也变得越来越重要。其中,JWT(JSON Web Token)鉴权和授权是一种常见的解决方案。 本篇文章将会介绍JWT鉴权和授权的原理、实现方式以及注意事项。 什么是JWT? JWT是一种基于JSON格式的开放标准(RFC7519),用于在网络

    2023年04月21日
    浏览(67)
  • ASP.NET Core 授权一(简单的Cookie)

    简单的理解:鉴权衡量你能不能进一道门,授权是你进门了可以干什么

    2024年02月04日
    浏览(50)
  • ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用

    右键单击“视图”文件夹,然后单击“添加”“新文件夹”,并将文件夹命名为“HelloWorld”。 右键单击“Views/HelloWorld”文件夹,然后单击“添加”“新项”。 在“添加新项 - MvcMovie”对话框中: 在右上角的搜索框中,输入“视图” 选择“Razor 视图 - 空” 保持“名称”框的

    2024年02月13日
    浏览(91)
  • Asp.Net Core 6 Cookie 的身份验证策略

    参考文献: http://www.js-code.com/xindejiqiao/xindejiqiao_274882.html https://www.cnblogs.com/xiaoxiaotank/p/15811749.html 编写代码过程中不理解的代码可参考上面的文献 首先需要配置你的Program.cs,代码如下: 然后开启中间件  创建一个AuthenticationMiddleware.cs类 在写登录的地方去使用  最后给你的控制

    2024年02月16日
    浏览(40)
  • C# ASP.NET Core Web API 身份授权(JWT)验证(一)

    1.开发环境 VS2022,安装时记得勾选ASP.NET有关的都选上,建议全选,省的麻烦。          2.创建初始工程 TestApi (你自己的工程名称)。    这就创建工程成功了,按 F5 则可以进行调试了。 而在项目中,我们不仅仅会用到基础的api功能,我们一般还会用到  身份授权(J

    2024年02月02日
    浏览(61)
  • ASP.NET Core高级之认证与授权(二)--JWT认证前后端完整实现

    了解JWT身份认证的流程 了解基于JWT身份认证和Session身份认证的区别 学习如何在ASP.NET Core WebAPI项目中封装JWT认证功能 在上文ASP.NET Core高级之认证与授权(一)–JWT入门-颁发、验证令牌中演示了JWT认证的一个入门案例,本文是一个基于JWT认证的完整的前后端实现代码案例。 JWT身

    2024年02月01日
    浏览(47)
  • ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现

    在上文《Keycloak中授权的实现》中,以一个实际案例介绍了Keycloak中用户授权的设置方法。现在回顾一下这个案例: 服务供应商(Service Provider)发布/WeatherForecast API供外部访问 在企业应用(Client)里有三个用户:super,daxnet,nobody 在企业应用里有两个用户组:administrators,u

    2024年04月22日
    浏览(55)
  • 【asp.net core】自定义模型绑定及其验证

    水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博客,如果大家有什么需求或者问题,可以找我,很高兴能为你们带来帮助。

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包