首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何访问HttpContext和RequireAssersion中的请求?

如何访问HttpContext和RequireAssersion中的请求?
EN

Stack Overflow用户
提问于 2021-12-13 12:46:48
回答 2查看 447关注 0票数 0

我正在尝试创建一个自定义授权策略。假设我希望URL包含一个令牌。例如:

代码语言:javascript
运行
复制
https://example.com/customer/list?token=2nHxltsDOjThQJWufcGU1v36RdqYoBE9

我想向用户显示客户列表,只有在以下情况下:

  1. URL具有令牌查询字符串
  2. 令牌是有效的

我试过这个:

代码语言:javascript
运行
复制
services.AddAuthorization(options =>
{
    options.AddPolicy("IsPaydar", policy => policy.RequireAssertion(x => // stuck here))
});

但我看不出如何从HttpContext内部访问policy.RequireAssertion或请求对象。

我如何实现这一点?

EN

回答 2

Stack Overflow用户

发布于 2021-12-14 06:26:02

您可以创建一个自定义授权处理程序,并在此处理程序中从查询字符串中获取令牌参数,并使joken有效。请参考以下步骤:

  1. 创建一个JwtTokenRequirement类:在这里我们可以设置查询字符串参数键值。然后在处理程序方法中,我们可以根据它找到令牌。

//必需使用Microsoft.AspNetCore.Authorization;公共类JwtTokenRequirement : IAuthorizationRequirement {公共JwtTokenRequirement(字符串令牌名称){ TokenName =令牌名称;}公共字符串TokenName { get;set;}

  1. 创建JWTTokenHandler:

//必需使用HandleRequirementAsync(AuthorizationHandlerContext;//必需使用Microsoft.AspNetCore.Http;公共类JWTTokenHandler : AuthorizationHandler { IHttpContextAccessor _httpContextAccessor = null;公共JWTTokenHandler(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor;}受保护的覆盖任务Microsoft.AspNetCore.Authorization上下文,JwtTokenRequirement要求){ httpContext HttpContext = _httpContextAccessor.HttpContext;// Access上下文在这里的var令牌= httpContext.Request.Queryrequirement.TokenName.ToString();//获取jwtkoken (!string.IsNullOrEmpty(令牌)){ if (IsValidToken(令牌)){context.Succeed( return );}context.Succeed{ context.Fail();}返回Task.FromResult(0);}公共bool IsValidToken(string authToken) {//验证令牌在这里返回true;} }

  1. 将以下代码添加到ConfigureServices方法中:

services.AddHttpContextAccessor();services.AddAuthorization(options => { options.AddPolicy("jwtpolicy",policy => policy.Requirements.Add(新JwtTokenRequirement(“jwttoken”);//配置策略并设置参数键值。在这个示例中,键是"jwttoken“};services.AddSingleton

  1. 在API操作方法上应用授权属性:

授权(Policy= "jwtpolicy")公共字符串Get(int ){返回"value";}

结果是这样:

票数 1
EN

Stack Overflow用户

发布于 2022-05-13 14:47:32

因为这个问题是专门关于RequireAssertion的,它使用一个Func,它接收一个AuthorizationHandlerContext,所以答案是HttpContext是AuthorizationHandlerContext的资源。若要使用OP的代码:

代码语言:javascript
运行
复制
services.AddAuthorization(options =>
{
    options.AddPolicy("IsPaydar", policy
        => policy.RequireAssertion(x => (x.Resource as HttpContext)?.Request?.Query["token"] == "myCoolToken")
});

资源属性是否真正包含HttpContext取决于框架,因此should的解决方案肯定会更加健壮,如果您的验证逻辑超过一行,您可能还是应该使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70334913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档