自定义授权处理程序中的数据库调用在 Blazor 服务器中返回 NullReference 错误

Database calls in Custom Authorization Handler returning a NullReference Error in Blazor Server

我目前正在创建一个使用 Azure AD 进行身份验证的 Blazor 服务器应用程序。身份验证工作完美,但我想在应用程序中设置一些 AuthorisedView。

我创建了一个自定义授权处理程序,通过它我可以获取用户的电子邮件并在我自己的 sql 服务器中找到他们所属的用户组。对于数据库调用,我将 Dapper 与一些 table 模型一起使用。当我在 HandleRequirementAsync 函数中进行数据库调用时,它 return 是一个 NullReference 异常。我看不出代码中哪里可能有错误,我是否漏掉了一些明显的东西?

用户列表应 return 数据库中的用户,然后组列表应 return 根据 ID 将用户分配到的组。这两个调用在应用程序的其余部分都可以完美运行,它只会在下面的这一部分中导致错误。

GroupHandler.cs

public class GroupHandler : AuthorizationHandler<GroupRequirement>
{
    public IUserData _dbUser;
    public IGroupData _dbGroup;

    protected async override Task<Task> HandleRequirement(AuthorizationHandlerContect context, GroupRequirement requirement)
    {
        var emailAddress = context.User.Identity.Name;

        List<UserModel> users = await _dbUser.GetUserByEmail(emailAddress);
        List<GroupModel> groups = await _dbGroup.GetGroupByID(users[0].Group_ID.ToString());

        if(groups[0].Group.Contains(requirement.Group))
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

GroupRequirement.cs

public class GroupRequirement : IAuthorizationRequirement
{
    public string Group { get; }

    public GroupRequirement(string group)
    {
        Group = group;
    }
}

Startup.cs

services.AddAuthorization(config =>
{
    config.AddPolicy("IsAdmin", policy =>
        policy.Requirements.Add(new GroupRequirement("Admin")));
});

错误

NullReferenceException: Object reference not set an instance of an object

GroupHandler.HandleRequirementAsync(AuthorizationHandlerContext context, GroupRequirement requirement) in GroupHandler.cs, line 30

List<UserModel> users = await _dbUser.GetUserByEmail(emailAddress);

问题出在这些行中,因为您根本没有初始化对象。因此,它们默认为 null。请初始化此属性。

    public IUserData _dbUser;
    public IGroupData _dbGroup;

您似乎从未在 GroupHandler class 中分配 _dbGroup 字段。

根据您的设置,您可以通过构造函数注入 IUserData