gpt4 book ai didi

c# - .Net Core 3.1 合并 JWT 和 OpenIDConnect 身份验证

转载 作者:行者123 更新时间:2023-12-03 17:11:50 28 4
gpt4 key购买 nike

短版:我无法在我的 .NET Core MVC 网站中将正确的身份验证配置合并在一起,以允许我的用户针对 Azure Active Directory 进行身份验证,但也允许守护进程连接(来自控制台应用程序)。

加长版:
我有一个 .NET Core MVC 网站,当在 Startup.cs 的 ConfigureServices 方法中使用以下内容时,它完全可以针对 Azure Active Directory 进行身份验证:

 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddSignIn("AzureAd", Configuration, options => Configuration.Bind("AzureAd", options));

我还试图让我的 .NET Core 控制台应用程序调用上述 MVC 网站的 API(作为守护程序连接)(所有这些都在我的 Microsoft Azure 帐户的应用程序注册部分中配置)。我可以将控制台应用程序连接到 MVC 网站,它会成功地在 Controller 中触发操作结果,但前提是我在网站的 Startup.cs 的 ConfigureServices 方法中使用以下内容:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddProtectedWebApi("AzureAd", Configuration, options => Configuration.Bind("AzureAD", options));

Here is a diagram of the architecture...

基本上,如果我只使用 OpenIdConnect 选项,我的网络用户可以访问该网站,但我的控制台应用程序被拒绝。如果我只使用 JwtBearer 选项,那么我的控制台应用程序可以连接,但我的网络用户被拒绝。

我整天都在用 Google-Bing,我正在努力让这两种配置的混搭工作,而不会将另一个淘汰。

我曾尝试使用 .AddJwtBearer() 方法,但完全被它弄糊涂了:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddSignIn("AzureAd", Configuration, options => Configuration.Bind("AzureAd", options))
.AddJwtBearer(options => Configuration.Bind("AzureAD", options));

这些如何协同工作,以便两者都可以就位,并且我的 Web 应用程序可以通过浏览器工作,并且控制台应用程序(守护程序)也可以工作?我可以将两者都绑定(bind)到我的 appsettings.json 文件吗?

顺便说一下,appsettings.json 文件如下所示:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "zzzzzzzzzzzzzz.onmicrosoft.com",
"TenantId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"CallbackPath": "/signin-oidc",
"SignedOutCallbackPath ": "/signout-callback-oidc",
"ClientSecret": "myAzureClientSecret"
}
}

2020 年 6 月 15 日更新:
在为 AGES 开启/关闭此功能后,我找到了一个合适的解决方案,因此我将奖励积分授予@michael-shterenberg。此外,我现在知道我可以从 @gary-archer 和他令人印象深刻的博客网站中学到很多东西。我只是碰巧从迈克尔的投入中获得了成功。

这是上图中 ASP.NET Core MVC Web 应用程序中 Startup.cs 文件的修改:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddSignIn("AzureAd", Configuration, options =>
Configuration.Bind("AzureAd", options))
.AddJwtBearer(o =>
{
o.Authority = "https://login.microsoftonline.com/common";
o.TokenValidationParameters.ValidateAudience = false;
o.TokenValidationParameters.ValidateIssuer = false;
});

services.AddAuthorization(options =>
{
options.AddPolicy("UserAndApp", builder =>
{
builder.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);

builder.AuthenticationSchemes.Add(OpenIdConnectDefaults.AuthenticationScheme);

builder.RequireAuthenticatedUser();
});
});

...再加上在我试图从守护程序应用程序调用的 Controller 上使用以下属性。
[Authorize("UserAndApp")]

我的用户仍然可以使用 Azure Active Directory 进程登录网站,现在我的自动化进程也可以登录。

如果有人在努力理解 Azure 应用程序注册方面的所有这些工作原理,请尝试这篇真正解释性的博客文章:

Secure a .NET Core API using Bearer Authentication

(我希望我早先看到这一点,当时我正试图了解 Azure 应用程序注册过程的工作原理!)

最佳答案

这是对我有用的解决方案(在 ASP .NET Core 2.1 和 3.1 上测试)

  • 不要设置默认身份验证方案,因为您有 2 种类型(Cookie 和 JWT)。即您调用 AddAuthentication应该没有参数:
  • services.AddAuthentication()
    .AddAzureAD(options => Configuration.Bind("AzureAd", options))
    .AddJwtBearer(o=> {
    o.Authority = "https://login.microsoftonline.com/common";
    o.TokenValidationParameters.ValidateAudience = false;
    o.TokenValidationParameters.ValidateIssuer = false;
    });
  • 请注意,我明确没有绑定(bind)您的 AD 配置,因为 /常见 需要申请权限(或租户id)
  • 此外,我将受众和发行者的验证设置为 false,以便任何 AAD token 都可以用于测试。您显然应该设置正确的受众/发行者
  • 我用了AddAzureAd而不是 AddSignIn (这是您正在使用的自定义外部库吗?)
  • 创建一个接受两种身份验证方案的策略:
  • services.AddAuthorization(options =>
    {
    options.AddPolicy("UserAndApp", builer =>
    {
    builer.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
    builer.AuthenticationSchemes.Add(AzureADDefaults.AuthenticationScheme);

    builer.RequireAuthenticatedUser();
    });
    });
  • 将此替换为您现有的授权设置
  • 在您的 Controller 中使用新的策略名称:
  • [Authorize("UserAndApp")]
    public class HomeController : Controller

    关于机制的一些解释:

    您不想设置自动身份验证方案,因为这将是授权中间件中运行的默认模式,而您有 2 种不同的类型

    该策略将尝试运行两个身份验证处理程序,如果其中一个成功,则身份验证成功

    备注 :如果您发送一个带有无效承载 token 的请求,两个身份验证处理程序都将失败,在这种情况下为 AzureADDefaults将“获胜”,因为它实际上实现了一个挑战方法并将重定向您(状态代码 302),因此请确保在您的应用程序中处理此问题

    关于c# - .Net Core 3.1 合并 JWT 和 OpenIDConnect 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62199248/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com