【问题标题】:Multiple Authentication in ASP.NET CoreASP.NET Core 中的多重身份验证
【发布时间】:2022-01-15 20:07:11
【问题描述】:

我的项目的认证(Cookie)设置如下,

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
            .AddCookie(options =>
            {
                options.ClaimsIssuer = "xxx.admin";
                options.Cookie.HttpOnly = true;
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
                options.LoginPath = "/Login/Index/";
                options.AccessDeniedPath = "/Account/Unauthorized/";
                options.Cookie.SameSite = SameSiteMode.Strict;
            });

我在不同的项目中配置了第二个身份验证选项(OpenIdConnect),如下所示,

         services.AddRazorPages().AddMvcOptions(options =>
        {
            var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        }).AddMicrosoftIdentityUI();

        services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureActiveDirectoryConnection", options);

            options.Events ??= new OpenIdConnectEvents();
            options.Events.OnTokenValidated += OnTokenValidated;
            options.Events.OnTicketReceived += OnTicketReceived;
            //options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProvider;
        });

现在,我需要将它们组合起来以在我的应用中支持多种身份验证类型。我该怎么做?

【问题讨论】:

  • this 能解决你的问题吗?
  • 如何理解“不同的项目”?一个解决方案有 2 个项目?那么什么是“组合它们”?对不起,我真的不清楚
  • @TinyWang 他们在不同的解决方案中(每个都有 1 个项目)并且组合意味着在我的应用程序中支持两种不同的身份验证。
  • 那么,您想将两个项目合二为一吗?或者您想在第一个项目中添加 OpenIdConnect 身份验证?
  • 我不确定,因为您没有在这里说出您的确切问题。所以也许你可以先参考this answer?顺便说一句,微软也提供了关于如何使用multi-authentication的官方文档。

标签: asp.net-core authentication microsoft-identity-web


【解决方案1】:

第 1 步:

将符合要求的 Microsoft.Identity.WebMicrosoft.Identity.Web.UI NuGet 包添加到您的项目中。

第 2 步:

.AddCookie(options => ..) 方法之后添加以下行。

.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureActiveDirectoryConnection"), "OpenIdConnect", "_Cookies", true);

services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options => {

    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnTokenValidated += OnTokenValidated;
    options.Events.OnTicketReceived += OnTicketReceived;
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProvider;
});

// This is for Azure AD SignIn and SignOut buttons' functions
services.AddRazorPages().AddMvcOptions(options => { }).AddMicrosoftIdentityUI();

// We say "I have multiple authentication schemes" to the app here
services.AddAuthorization(options =>
{
    var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
    defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});

简单来说,您在这里添加第二个身份验证选项并指定您需要的事件并绑定来自AppSettings文件的Azure AD clientId、tenantId等,例如:

"AzureActiveDirectoryConnection": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "YourDomainName.onmicrosoft.com",
  "TenantId": "YourTenantId",
  "ClientId": "YourClientId",
  "CallbackPath": "/signin-oidc",
  "SignedOutCallbackPath ": "/signout-oidc"
}

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2017-03-30
    • 2018-06-25
    • 2016-05-19
    • 2018-05-13
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多