使用 Owin 对多个 .net 应用进行 Web API 2.0 授权

7
我有两个.NET应用程序。两个应用程序都使用C#编写WebAPI 2.0 API。
假设一个是父应用程序,另一个是子应用程序。父应用程序具有Owin身份验证,并且所有API都按预期进行授权。
在子应用程序中,我想使用与父应用程序中使用的相同的授权提供程序。我不想再次为子应用程序使用身份验证。
我尝试了两件事:
1. 在两个应用程序中使用相同的机器密钥 2. 尝试创建第三个独立的.NET应用程序,该应用程序将为两个应用程序提供身份验证和授权
第一种方法没有起作用。我不确定如何实现第二种方法。
任何帮助都将不胜感激。
谢谢。

你想要实现“代表”的流程吗?请查看此存储库 --- https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof - user1672994
您可能会发现这对设置机器密钥有所帮助。https://dev59.com/64Pba4cB1Zd3GeqPpTz7 - ATerry
@user1672994 我没有使用Azure。谢谢你的帮助。 - sandipchandanshive
@ATerry 我已经尝试使用机器密钥了。使用相同的机器密钥来运行这两个应用程序后,一个应用程序生成的令牌无法被另一个应用程序识别。 - sandipchandanshive
2个回答

2

如果我理解正确,您想找到一种方法,在父服务认证通过的情况下,对子服务进行身份验证并在服务之间传递身份验证。

我们在这里也需要同样的东西,以便在前端服务(父服务)后面验证微服务的身份。

我们使用JWT来实现,因为使用它,我们可以解决这个问题,因为在子服务(在我们的情况下是微服务)中,它们信任父身份验证。

服务的工作方式如下:父服务或其他身份验证服务创建有效的JWT以在父服务上使用。

当父服务收到JWT时,它将验证所有必要的内容以确保客户端正确。当父服务需要调用子服务时,它将发送相同的JWT,但在子服务中,JWT将不同,在我们的情况下,我们只验证生命周期和发行人签名密钥。

我们最终得到了像这样的代码,放在我们的Startup.cs文件中的子服务上,我们的父服务/身份验证服务保持不变。

public static void ConfigureAuth(IServiceCollection services)
{
    services
        .AddAuthentication(o =>
        {
            o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(o =>
        {
            o.SaveToken = true;
            o.TokenValidationParameters = new TokenValidationParameters
            {
                // Must validate the signing key
                ValidateIssuerSigningKey = true,

                // Must validate the life time
                ValidateLifetime = true,

                // The issuer may vary in a multitenant scenario,
                // that's why we not valid the issuer.
                ValidateIssuer = false,
                ValidIssuer = o.ClaimsIssuer,

                // Allowing passing a token among multiple services (audiences).
                ValidateAudience = false,
                ValidAudience = "",

                // Does not require expiration
                RequireExpirationTime = false,
                ClockSkew = TimeSpan.Zero
            };
        });
}

如果您仍然有疑虑,我建议您查看微服务之间的认证,也许可以帮助解决问题。

1
将由父应用生成的身份验证令牌(如有需要,连同用户身份信息一起)存储在安全的Redis缓存中。
然后,您可以从父API的授权端点上的后续请求中获取令牌,并将其附加到对子API的任何调用中:
public class ValuesController : ApiController
{
  [Authorize]
  public IHttpActionResult Get()
  {
    var authToken = Request.Headers.Authorization;
    // send authToken with requests to child endpoints
  }
}

然后在Child API上,您可以以类似的方式获取身份验证令牌,并根据存储的Redis令牌进行查找和验证。
如果您在中间件中获取令牌,则会得到额外的积分。

谢谢你的帮助。我也可以将令牌存储到数据库中,但我认为这会增加负担; - sandipchandanshive
将令牌存储在Redis中并不罕见。您可以获得很多灵活性,并且比数据库存储要快得多,开销应该很小。 - JvR

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