其实我们既然集成了Fution,就可以用Furion带的方式来验证。
创建AdminHandler
我们还是去创建AdminHandler
,但是跟策略不一样的是我们的Handler不继承于AuthorizationHandler
,而是继承Furion的AppAuthorizeHandler
。
public class AdminHandler : AppAuthorizeHandler
AppAuthorizeHandler
有两个比较重要的方法。
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
和
public override async Task HandleAsync(AuthorizationHandlerContext context)
PipelineAsync
进入的时候已经完成了基本的验证,能确定该用户已经登录了,返回值是一个bool
。
HandleAsync
就是我们使用策略时的HandleRequirementAsync
,也需要用context.Succeed
来做处理。
这里我们就直接使用PipelineAsync
就行了,比较省心。所以我们的代码如下:
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
if (!int.TryParse(context.User.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
{
return Task.FromResult(false);
}
if (context.Resource is RouteData routeData)
{
var routeAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
x.AttributeType == typeof(RouteAttribute));
if (routeAttr == null)
{
return Task.FromResult(true);
}
else
{
var url = routeAttr.ConstructorArguments[0].Value as string;
var permission = PermissionEntity
.Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == url).First();
if (permission != null)
{
return Task.FromResult(true);
}
}
}
return Task.FromResult(false);
}
整体的逻辑与使用策略时相同。这里不再多说了。
App.razor
App里一样要加上Resource="@routeData"
,不然我们无法获取到路由信息。
Pragram.cs
我们同样需要在Proagram.cs
里注册我们的Handler,但是比使用策略注册要简单的多,只需要一句话。
builder.Services.AddAppAuthorization<AdminHandler>();
使用
我们的Handler默认是默认策略,所以我们不需要在加策略名称,只需要在需要使用的地方,比如index.razor
中增加
@attribute [Authorize]
即可。
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293454.html