基于最小API身份验证获取数据

问题描述 投票:0回答:1

我正在使用本教程为我的最小 API (.Net 7) 设置身份验证和授权:https://www.telerik.com/blogs/authorization-authentication-minimal-apis

我以前从未这样做过,我很好奇我的想法是否正确。我需要检查应该从数据库接收的数据是否与经过身份验证的用户连接(基本上我想防止其他用户查看其他用户的数据 - 只有“管理员”角色可以做到这一点)。这是正确的方法还是我错过了一些东西(有没有比下面写的更优雅的方法)?

在此示例中:假设只有当用户登录(昵称“test123”的用户)时,他只能接收自己的信息(来自数据库的有关用户“test123”的数据),但不能接收任何其他信息(仅登录的用户具有角色“管理员”可以做到这一点):

app.MapGet("/users/{nickname}", (string nickname, ClaimsPrincipal user, IUserData userData) =>
{
    if (user?.Identity?.Name == nickname ||
        user?.IsInRole("Admin") ?? false)
    {
        try
        {
            return Results.Ok(await userData.GetUserByNickname());
        }
        catch(Exception ex)
        {
            return Results.Problem(ex.Message);
        }
    }
    
    return Results.Unauthorized();
});
c# .net asp.net-core authorization minimal-apis
1个回答
0
投票

您可以执行此操作,但请注意,Minimal API 支持

AuthorizeAttribute
(docs),因此您可以尝试以下操作:

builder.Services.AddAuthorization(o => o.AddPolicy("AdminsOnly", 
    b => b.RequireRole("Admin")));

// ...

app.MapGet("/users/{nickname}", [Authorize("AdminsOnlyPolicy")] (string nickname, IUserData userData) =>
{
        try
        {
            return Results.Ok(await userData.GetUserByNickname());
        }
        catch(Exception ex)
        {
            return Results.Problem(ex.Message);
        }
});
© www.soinside.com 2019 - 2024. All rights reserved.