c# - .Net 核心身份和 Azure AD 身份验证

标签 c# authentication asp.net-core azure-active-directory asp.net-identity

我有一个 net core web 应用程序,它具有 net core identity 登录设置和工作,它创建并登录存储在我们数据库中的用户。我的下一步是将 Azure Active Directory 添加为外部登录方式,这也很好用,在大多数情况下,我能够登录。

我的问题是,当我添加 AAD 身份验证时,身份验证方式不再适用于让我登录。

理想情况下,网络应用程序将使用 ADD 来验证用户身份,但如果失败,用户仍然可以选择在本地登录以进行身份​​验证。本质上,ADD 将是默认登录,身份将是备份。

我遵循了以下帖子的建议,因为它与我希望我的网络应用程序执行的操作非常相似,方法是将 AddCookie() 添加到 Startup.cs 文件,但是当我这样做时 ADD 失败用消息验证我:

“我们无法让您登录。请重试。”

Hybrid authentication in .net core with Open Id Connect and local database

下面是我的 Startup.cs 文件的样子,我已经从上面的帖子中删除了 AddCookies() 调用,这样我就可以让 ADD 再次登录。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
        options.Authority = options.Authority + "/v2.0/";         // Microsoft identity platform

        options.TokenValidationParameters.ValidateIssuer = false; // accept several tenants (here simplified)


    });

    services.AddMvc(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

我怀疑它可能与以下调用有关:

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

也许我需要添加额外的身份验证选项?我已尝试以下操作,但 ADD 未对我进行身份验证,我从 ADD 收到相同的消息:

“我们无法让您登录。请重试。”

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
})
.AddAzureAD(options => Configuration.Bind("AzureAd", options));

我对身份验证还很陌生,非常感谢任何帮助,谢谢。

最佳答案

我认为您只需要注册这两种身份验证方案。

交换这段代码:

    services.AddMvc(options =>
    {
        var policy = new AuthorizationPolicyBuilder(
                AzureADDefaults.AuthenticationScheme, 
                AzureADDefaults.OpenIdScheme)
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    });

关于c# - .Net 核心身份和 Azure AD 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57717765/

相关文章:

c# - 图形容器如何工作?

c# - 如何遍历 ChartColorPalette 属性并添加到列表?

c# - 有没有关于编写商业质量软件的好书?

php - 在 php 中发送 SOAP 身份验证 header 的问题

c# - 示例请求正文中 JsonPatchDocument 的 Swagger 意外 API PATCH 操作文档

c# - Jwt Bearer 和依赖注入(inject)

c# - 将纯文本从文本框转换为 SHA1,然后将 Sha1 转换为基数 64 C#

PHP Laravel 身份验证与重试计数

authentication - 团队选项卡身份验证

c# - ASP.Core 中的 .NET 版本