身份验证和授权作为中央微服务 ASP.NET



我计划将包括身份验证和授权以及所有服务在内的 ASP.NET Web API 2.0更改为微服务架构。

如果我创建中央微服务来处理身份验证和授权,我的问题。如何授权用户使用令牌发送请求到其他服务?

详细阐述这个问题:

假设我有三个微服务。 1)处理身份验证和授权的ASP NET框架,它将对用户进行身份验证并发送令牌。 2 ) 订单服务,它将接收标头中包含令牌的请求。(ASP NET core) 3 ) 会计服务,它将接收标头中包含令牌的请求。(ASP NET core)

当用户调用服务 2 或 3 时,我们如何授权用户? 这是一种理想的方法吗?

与其在每个微服务上对外部请求进行身份验证(您可能希望对内部微服务通信执行此操作),我会安装一个网关(例如 Ocelot,它可以使用您使用的任何系统为您处理外部"上游"身份验证,例如 JWT 持有者:

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddJwtBearer("TestScheme", x => ...
}

然后在Ocelot中,您可以决定哪些路线需要此方案,如下所示

"Routes": [{
"DownstreamHostAndPorts": [...],
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"AuthenticationOptions": {
"AuthenticationProviderKey": "TestScheme", //<--here decide to use this scheme
"AllowedScopes": []
}
}]

如果身份验证成功,您可以使用 Ocelot 的"声明到声明转换"方法从上游到下游此方法 - 我个人想要自定义它并为内部身份验证构建一个新的 Jwt 令牌,因此使用了我自己的下游处理程序,如下所示:

services
.AddHttpClient<IMyService, MyService>(client => ...)
.AddHttpMessageHandler<MyJwtDownstreamHandler>();
//then in the MyJwtDownstreamHandler
request.Headers.Authorization = new AuthenticationHeaderValue(
"bearer",
TokenGenerator.Generate( //<--generate your own Symmetric token using your own method
identity: myIdentity, //<--claims for downstream here
)
);

基于上面的评论

外部标识提供者

您可能需要使用外部身份提供程序,例如 identiyserver4、azure ad 或 auth0 等。由于生成的令牌可能是 JWT 令牌,因此您必须验证令牌。

验证令牌

需要在 .Net 核心中间件中验证令牌。颁发的每个令牌都有一个有效负载,应用中间件将验证每个传入令牌,如果无法验证,则拒绝。您的中间件将填充声明原则,该原则可以在您的应用程序中用于验证授权,例如角色(如果用户有权访问特定 api)。您可以将"授权"属性放在控制器顶部,它将完成这项工作。

可以手动验证令牌,也可以由某些标识提供者提供自动验证,例如,Azure 广告将验证令牌并填写声明原则,而无需通过简单地添加 Azure ad nuget 包来执行太多工作。

如果你只是谷歌,有很多例子。令牌可能会令人困惑,因此我建议您了解令牌,例如id_token,access_token,刷新令牌。身份验证流和声明。如果您了解令牌类型和流程,这将变得更容易。我附上非常简单的例子只是为了给你想法。

最新更新