身份验证和授权作为中心化的微服务在ASP.NET中的应用

7
我计划将包括身份验证和授权以及所有服务的ASP.NET Web API 2.0改为微服务架构。我的问题是,如果我创建一个中央微服务来处理身份验证和授权,那么如何使用他们的令牌授权用户发送请求到其他服务?更具体地说,假设有三个微服务:1)处理身份验证和授权的ASP .NET框架,它将对用户进行身份验证并发送令牌。2)订单服务,它将接收包含令牌的请求头的请求(ASP .NET Core)。3)会计服务,它将接收包含令牌的请求头的请求(ASP .NET Core)。我们如何在用户调用服务2或3时授权用户?这种方法是否理想?

您的身份验证和授权服务将生成JWT令牌。该令牌将作为Bearer令牌发送到其他服务。您的其他服务将在其中间件中验证JWT令牌。 - Imran Arshad
请参见:http://docs.identityserver.io/en/latest/ - Chris Pratt
1
@ImranArshad 谢谢你的建议。我的API是用ASP.NET框架编写的,它将使用OAuthProvider生成令牌,现在我想在不同的ASP.NET Core服务中授权该令牌,并通过该令牌获取userId,以便可以从数据库中检索数据。这可能吗?如果可能的话,你能否指导我所涉及的步骤或者提供一个示例文章或文档。 - sai dharmendra kanneganti
2个回答

5

不必在每个微服务中对外部请求进行身份验证(您可能希望对内部微服务通信进行身份验证),而应安装一个网关(例如Ocelot),使用您正在使用的任何系统,例如Jwt bearer,可以为您处理外部“上游”身份验证:

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
   )
);

4

基于以上评论

外部身份提供程序

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

验证令牌

您需要在.Net Core中间件中验证令牌。每个发出的令牌都具有有效载荷,您的应用程序中间件将验证每个传入的令牌,并且如果无法验证,则将其拒绝。您的中间件将填充声明原则,这些声明原则可以在应用程序中用于验证授权,例如角色(如果用户有授权访问特定API)。您可以在控制器顶部放置“authorize”属性,它会起到作用。

您可以自行验证令牌,或者一些身份提供程序提供自动验证,例如Azure Ad将验证令牌并填充声明原则,而不需要通过简单添加Azure ad nuget包来做太多功夫。

如果您只是谷歌搜索一下,就会有大量示例。令牌可能令人困惑,因此我建议您了解令牌,例如id_token、access_token、refresh token。认证流程和声明。如果您了解标记类型和流程,将变得更容易。我附上一个非常简单的示例,只是为了给您提供想法。

示例


只是确认一下,我需要将现有的ASP.NET Web API身份提供程序替换为外部身份提供程序,以生成JWT令牌,从而允许我的其他微服务进行消费和认证吗? 如果是的话,我需要编写一个新的API(这次最好使用ASP.Net Core API)来生成令牌。 是否有任何方法可以使用现有的API来生成令牌,并从现在开始编写新的微服务? - sai dharmendra kanneganti
从问题中我假设您需要从头开始编写系统。如果您已经使用身份提供者,则可以使用它。您正在使用哪个身份提供者?您可能需要分享有关现有身份提供者的更多详细信息,以及整个系统的进展情况以及缺少哪些部分? - Imran Arshad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接