我打算将ASP.NET Web API 2.0(包括身份验证和授权以及所有服务)更改为Microservices体系结构。
我的问题,如果我创建一个中央微服务来处理身份验证和授权。如何授权用户将其令牌发送给其他服务的用户?
要详细说明问题,
假设我有三个微服务。 1)处理身份验证和授权的ASP NET框架,它将对用户进行身份验证并发送令牌。 2)订单服务,它将接收标头中带有令牌的请求。 (ASP NET核心) 3)记帐服务,它将接收带有标头的令牌的请求。 (ASP NET核心)
当用户致电服务2或3时,我们如何授权他们? 这是理想的方法吗?
答案 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,刷新令牌。认证流程和声明。如果您了解令牌的类型和流程,它将变得更加容易。我附上一个非常简单的示例,只是为了给您一个想法。