我正在尝试创建一个自定义授权策略。假设我希望URL包含一个令牌。例如:
https://example.com/customer/list?token=2nHxltsDOjThQJWufcGU1v36RdqYoBE9
我想向用户显示客户列表,只有在以下情况下:
我试过这个:
services.AddAuthorization(options =>
{
options.AddPolicy("IsPaydar", policy => policy.RequireAssertion(x => // stuck here))
});
但我看不出如何从HttpContext内部访问policy.RequireAssertion
或请求对象。
我如何实现这一点?
发布于 2021-12-14 06:26:02
您可以创建一个自定义授权处理程序,并在此处理程序中从查询字符串中获取令牌参数,并使joken有效。请参考以下步骤:
//必需使用Microsoft.AspNetCore.Authorization;公共类JwtTokenRequirement : IAuthorizationRequirement {公共JwtTokenRequirement(字符串令牌名称){ TokenName =令牌名称;}公共字符串TokenName { get;set;}
//必需使用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;} }
services.AddHttpContextAccessor();services.AddAuthorization(options => { options.AddPolicy("jwtpolicy",policy => policy.Requirements.Add(新JwtTokenRequirement(“jwttoken”);//配置策略并设置参数键值。在这个示例中,键是"jwttoken“};services.AddSingleton
授权(Policy= "jwtpolicy")公共字符串Get(int ){返回"value";}
结果是这样:
发布于 2022-05-13 14:47:32
因为这个问题是专门关于RequireAssertion
的,它使用一个Func,它接收一个AuthorizationHandlerContext
,所以答案是HttpContext是AuthorizationHandlerContext的资源。若要使用OP的代码:
services.AddAuthorization(options =>
{
options.AddPolicy("IsPaydar", policy
=> policy.RequireAssertion(x => (x.Resource as HttpContext)?.Request?.Query["token"] == "myCoolToken")
});
资源属性是否真正包含HttpContext取决于框架,因此should的解决方案肯定会更加健壮,如果您的验证逻辑超过一行,您可能还是应该使用它。
https://stackoverflow.com/questions/70334913
复制相似问题