2

从 .NET Core 3 移植到 .NET Core 5 身份验证,我需要用 services.AddMicrosoftIdentityWebAppAuthentication 或其他相关的 MicrosoftIdentity 扩展替换 services.AddSignIn(已弃用)。我需要支持 API 访问的 OpenId 用户登录和 Bearer 令牌策略。这些都与 services.AddSignIn 一起使用,但我无法让这种组合与新的 MicrosftIdentity 扩展一起使用。

我有一个使用 OpenId 登录到 Azure AD B2C 的 .Net Core Blazor 服务器。这可以正常工作:

            services.AddMicrosoftIdentityWebAppAuthentication(
            configuration,
            aadB2CConfigName,
            OpenIdConnectDefaults.AuthenticationScheme,
            CookieAuthenticationDefaults.AuthenticationScheme,
            true);

但是当我直接在它之后添加承载令牌处理时,如下所示,它会覆盖 OpenId,因此只有承载 API 有效(反之亦然):

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(
                options =>
                {
                    configuration.Bind("AzureAd", options);

                    options.ForwardDefaultSelector = ctx =>
                        ctx.Request.Path.StartsWithSegments("/api", System.StringComparison.InvariantCulture)
                            ? JwtBearerDefaults.AuthenticationScheme
                            : null;

                    options.Authority = configuration["AzureAd:Authority"];
                    options.TokenValidationParameters.NameClaimType = "name";
                    options.TokenValidationParameters.RoleClaimType = "roles";

                }, options =>
                {
                    configuration.Bind(aadB2CConfigName, options);
                });

为了完整起见,其次是(在 .net core 3 中运行良好)

        services.AddControllersWithViews()
            .AddMicrosoftIdentityUI();

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Tst1AuthPolicy", policy => policy.RequireRole("Tst1AppRole"));
            options.AddPolicy("Tst2AuthPolicy", policy => policy.RequireRole("Tst2AppRole"));
        });

扩展方法的链接似乎不像 AddSignIn 那样工作。如何在新的 .net core 5 上下文中使这两项再次并行工作?ie OpenId 作为默认值,当 WebApi (/api) 被命中时使用 Bearer Tokens。

4

1 回答 1

1

让它工作如下。我不完全相信这是这里的预期/最佳用法,但它有效:

将上面的“null”替换为备用登录方案,在我们的例子中是 oreo cookie 方案:

options.ForwardDefaultSelector = ctx =>
ctx.Request.Path.StartsWithSegments("/api", System.StringComparison.InvariantCulture)
    ? JwtBearerDefaults.AuthenticationScheme
    : CookieAuthenticationDefaults.AuthenticationScheme;

这可能意味着,如果承载令牌失败,我会得到一个 HTML 登录页面,而不是 HTTP 状态错误,所以必须有更好的方法......如果有人愿意插话。

于 2021-01-25T16:38:13.457 回答