微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.Net Core 5 AddMicrosoftIdentityWebAppAuthentication,现在如何结合OpenId和Bearer?

如何解决.Net Core 5 AddMicrosoftIdentityWebAppAuthentication,现在如何结合OpenId和Bearer?

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

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

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

但是当我在它之后直接添加 Bearer Token 处理时,如下所示,它会覆盖 OpenId,因此只有 Bearer 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 上下文中让这两项再次并行工作?即认为 OpenId,并在点击 WebApi (/api) 时使用 Bearer Tokens。

谢谢!

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。