【发布时间】:2019-09-03 11:20:20
【问题描述】:
看了几篇文章,尤其是this
我制作了自己的 ASP.NET Core 解决方案
Authentication和Authorisation的 1 个项目(AuthServer),以及1 个项目 (WebApi) 用于我的整个项目中的其余 API。
问题是: 如何在我的 WebApi 项目中验证 http 请求?
我知道一旦用户通过身份验证,客户端将持有令牌,对于后续请求,他们都需要传递令牌,在服务器端,它以某种方式通过这段代码验证这些请求AuthServer 项目的 Startup.cs:
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x=> {
x.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
var userId = context.Principal.Identity.Name;
var user = userService.GetById(userId);
if(user == null)
{
context.Fail("Unauthorized");
}
return Task.CompletedTask;
}
};
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters {
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
但是对于 WebApi 项目,我需要做什么来验证令牌? 我想这不仅仅是在控制器上放置注释([Authorize])或类似的操作:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{ ....}
那我应该怎么做来验证我的 WebApi 项目中的令牌呢?
每次有请求进来时调用我的AuthServer项目中的Authenticate端点,然后执行WebApi中的代码?
【问题讨论】:
-
通常您会先让客户端调用您的身份验证 API,从 Authenticate 端点获取令牌,然后客户端会在任何时候将该令牌作为标头值(不记名令牌)包含在请求中转到您的 WebApi 请求。我认为,如果您使用 Google 搜索任何类型的“JWT ASP.NET Core”,您应该找到有关如何在 WebApi 端查找传入身份验证令牌的示例。
-
嗨@BenKrueger 感谢您的回复。我又找了一遍,所有的文章还是把 AuthServer 和 WebApi 项目的实现都说成一个项目。
-
@Franva 看来您可能想要运行 2 个单独的 ASP.NET 应用程序,一个处理授权,第二个处理剩余逻辑?
-
@Andriy 是的。这是我看了很多文章后的印象。能否请你帮忙?谢谢
-
我建议您查看IdentityServer。使用它,您可以设置适当的身份验证提供程序(作为单独的服务器)和安全的 API 服务器,然后您可以使用经过身份验证的服务器。 quickstarts documentation 也将涵盖您的情况。
标签: c# asp.net-web-api asp.net-core jwt