作为中央MicroService ASP.NET的身份验证和授权

时间:2019-04-08 15:38:00

标签: asp.net-web-api asp.net-core asp.net-identity microservices asp.net-authorization

我打算将ASP.NET Web API 2.0(包括身份验证和授权以及所有服务)更改为Microservices体系结构。

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

要详细说明问题,

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

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

2 个答案:

答案 0 :(得分:2)

我将安装网关(例如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从上游到下游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
   )
);

答案 1 :(得分:0)

基于上面的评论

外部身份提供者

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

验证令牌

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

您可以手动验证令牌,或某些身份提供商提供自动验证,例如通过简单地添加Azure广告nuget程序包,Azure广告将无需花费太多精力即可验证令牌并满足声明原则。

如果您只是用谷歌搜索,就有很多例子。令牌可能会令人困惑,所以我建议您了解令牌,例如id_token,access_token,刷新令牌。认证流程和声明。如果您了解令牌的类型和流程,它将变得更加容易。我附上一个非常简单的示例,只是为了给您一个想法。

Example