從零開始Blazor Server(7)--使用Furion許可權驗證

2022-08-04 12:00:37

上面兩篇我們講了怎麼用OnNavigateAsync來驗證許可權,又寫了怎麼用策略來驗證許可權。


其實我們既然整合了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]

即可。


原始碼在github:https://github.com/j4587698/BlazorLearn,分支lesson7.