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

Authentication and authorization as a central MicroService ASP.NET

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

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

详细说明问题:

假设我有三个微服务。 1 ) ASP NET 框架处理身份验证和授权,它将对用户进行身份验证并发送令牌。 2 ) Orders 服务,它将接收带有 headers 中令牌的请求。 (ASP.NET 核心) 3 ) Accounting service,它会在他们的headers中接收带有token的请求。 (ASP NET 核心)

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

基于以上评论

外部身份提供商

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

验证令牌

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

您可以手动验证令牌或某些身份提供者提供自动验证,例如Azure Ad 将通过简单地添加 Azure ad nuget 包来验证令牌并填写声明原则,而无需付出太多努力。

如果您只是google,就会有很多例子。令牌可能会造成混淆,所以我建议您了解令牌,例如id_token,access_token,刷新令牌。身份验证流程和声明。如果您了解令牌类型和流程,事情会变得更容易。我附上一个非常简单的例子只是为了给你一个想法。

Example

我不会在每个微服务上验证外部请求(您可能想为内部微服务通信这样做),而是安装一个网关(例如 Ocelot 可以处理外部 "upstream" 身份验证为您使用您正在使用的任何系统,例如 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 的 "claims to claims transformation" 从上游到下游的方法 this method - 我个人想要自定义它并构建一个新的 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
   )
);