首页 新闻 会员 周边

.net6 webapi怎么给接口授权?

0
悬赏园豆:10 [待解决问题]

为什么我设置了[Authorize],还是可以直接访问UserController中的接口?

天亦玄的主页 天亦玄 | 初学一级 | 园豆:32
提问于:2023-06-18 01:40
< >
分享
所有回答(3)
0

在ASP.NET Core中,使用[Authorize]特性未必能够防止所有未授权的访问。可能是因为你的用户角色不正确,或者是由于你的授权策略设置不正确。请确保用户角色与你的授权策略匹配,并检查授权策略中是否包含[AllowAnonymous]特性,因为它会覆盖[Authorize]特性。

此外,你还可以尝试使用[Authorize(Roles = "RoleName")]特性来限制特定角色的访问。如果仍然无法解决问题,你可以使用调试工具来检查当前用户是否有权限访问你的控制器和操作。

这里提供一个ASP.NET Core的示例代码,演示如何使用[Authorize]特性来限制访问。首先,我们需要在Startup.cs文件中配置授权服务:

public void ConfigureServices(IServiceCollection services)
{
    // 省略其它配置

    // 配置授权服务
    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("admin"));
    });
}

在这个示例中,我们将添加一个名为"RequireAdminRole"的授权策略,并要求用户角色为"admin"时才能访问受限制的操作。

接下来,我们可以在控制器的操作方法上添加[Authorize]特性来限制访问:

[Authorize(Roles = "admin")]
public IActionResult RestrictedAction()
{
    return View();
}

在这个示例中,我们使用[Authorize(Roles = "admin")]来指定需要admin角色才能访问RestrictedAction操作。如果当前用户没有admin角色,则会收到一个未经授权的访问错误。

注意,如果用户角色设置不正确,或者你的授权策略设置不正确,[Authorize]特性仍然无法防止未授权的访问。

小九九呀 | 园豆:383 (菜鸟二级) | 2023-06-18 09:34

非的加上角色吗?能不能只要带上token就能访问,没有token就禁止访问呢

支持(0) 反对(0) 天亦玄 | 园豆:32 (初学一级) | 2023-06-18 15:17

@天亦玄: 可以通过使用 JWT token 来实现基于令牌的身份验证,实现类似你说的"带上token才能访问,没有token禁止访问"这种要求。

首先,你需要在授权服务中配置 JWT 认证方案:

services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Jwt:Secret"])),
        ValidateIssuer = false,
        ValidateAudience = false
    };
});

在这个示例中,我们使用 JWT 认证方案作为默认的验证方案。使用 AddJwtBearer 方法可以配置 JWT 的验证参数,包括密钥、令牌有效期等参数。

然后,在对指定的控制器和操作方法使用 [Authorize] 特性时,指定使用 JWT 认证方案:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public IActionResult RestrictedAction()
{
    return View();
}

在这个示例中,我们将授权方案设置为 JWT 认证方案。

这样,访问本控制器的具体操作时,客户端需要通过在请求头中提供 JWT token,才能被认为是授权访问。

授权的方式是在 API 服务器端据当前身份(请求头的 jwt token)鉴别出当前用户。因为身份信息都在 JWT token 中,所以这种方案可以避免服务器在访问验证时需要查找存储的会话状态或数据库。

当身份验证失败时,会自动返回 401-Unauthorized 状态给客户端。

支持(0) 反对(0) 小九九呀 | 园豆:383 (菜鸟二级) | 2023-06-18 18:51
0

下面的代码是放在 app.UseEndpoints() 之前吗?

app.UseAuthentication();
app.UseAuthorization();
dudu | 园豆:30943 (高人七级) | 2023-06-18 11:32

是的,一般来说你需要在调用 app.UseEndpoints() 方法之前调用 app.UseAuthentication() 和 app.UseAuthorization() 方法,以确保路由授权和认证策略先执行。这是为了确保只有经过验证的用户才能够访问受保护的端点。同时,由于这两个方法仅在管道中添加中间件且不会返回任何内容,因此在管道中的相对顺序不会对它们的行为产生影响。以下是一些示例代码:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/", async context =>
    {
        await context.Response.WriteAsync("Hello World!");
    }).RequireAuthorization();
});

或者你可以反过来写,如下所示:

app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/", async context =>
    {
        await context.Response.WriteAsync("Hello World!");
    }).RequireAuthorization();
});

在以上两种情况下,管道中的中间件顺序都是正确的。

支持(0) 反对(0) 小九九呀 | 园豆:383 (菜鸟二级) | 2023-06-18 14:39
0
  1. StartUp类中注册Authentication
services.Configure<TokenManagement>(Configuration.GetSection("tokenManagement"));
var token = Configuration.GetSection("tokenManagement").Get<TokenManagement>();

services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(token.Secret)),
        ValidIssuer = token.Issuer,
        ValidAudience = token.Audience,
        ValidateIssuer = false,
        ValidateAudience = false
    };
});

  1. 注册中间件
app.UseAuthentication();

如果是前后端分离的,一般都用JWT token认证。

智客工坊 | 园豆:1855 (小虾三级) | 2023-06-18 21:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册