C# Azure广告作为一个;外部提供者;?

C# Azure广告作为一个;外部提供者;?,c#,azure,azure-active-directory,asp.net-identity,asp.net-core-2.0,C#,Azure,Azure Active Directory,Asp.net Identity,Asp.net Core 2.0,我正在尝试构建一个简单的ASP.NETCore2.2Web应用程序,允许AzureAD作为“外部提供商”。我正在Visual Studio 2019中进行此操作 作为一个超级简单的演示项目,我首先创建了一个使用Azure AD作为登录提供商的新项目: 选择ASP.NET核心Web应用程序 选择Web应用程序(模型视图控制器) 将身份验证更改为“工作或学校帐户”。它会自动填入我的域名(因为我已登录到VS) 这将创建一个web应用程序,用于在所有页面上强制执行用户身份验证。当我运行应用程序时,它会转

我正在尝试构建一个简单的ASP.NETCore2.2Web应用程序,允许AzureAD作为“外部提供商”。我正在Visual Studio 2019中进行此操作

作为一个超级简单的演示项目,我首先创建了一个使用Azure AD作为登录提供商的新项目:

  • 选择ASP.NET核心Web应用程序
  • 选择Web应用程序(模型视图控制器)
  • 将身份验证更改为“工作或学校帐户”。它会自动填入我的域名(因为我已登录到VS)
  • 这将创建一个web应用程序,用于在所有页面上强制执行用户身份验证。当我运行应用程序时,它会转到Azure AD并在导航到
    /home
    页面之前让我登录

    回想一下,我说过我想将Azure广告添加为外部提供商。所以我在
    Startup.cs
    中找到了这一行:

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    
    我删除了默认的身份验证方案以防止自动登录,如下所示:

    services.AddAuthentication()
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    
    现在,当我运行应用程序时,它会导航到
    登录
    页面,它会给我一个蓝色的大按钮,让我可以登录Azure Active Directory。但单击该按钮不会让我登录

    因此,我构建了标识页,并在
    ExternalLogin
    GET例程上设置了一个断点。果然,点击蓝色的大按钮就找到了。在代码中,我看到对
    \u signInManager.getExternalLoginFoAsync()
    的调用返回null


    我卡住了。显然,(未记录的)配置魔法没有正确设置某些内容以满足对
    getexternallogininfosync

    的调用。场景是您使用asp.net标识和Azure AD登录作为外部标识提供程序

    您应该将
    IdentityConstants.ExternalScheme
    设置为Azure AD身份验证的登录模式,以便您可以使用
    \u signInManager.getexternallogininfosync()
    获取外部用户信息:

    services.AddDbContext(选项=>
    options.UseSqlServer(
    GetConnectionString(“DefaultConnection”);
    services.AddDefaultIdentity()
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores();
    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options=>Configuration.Bind(“AzureAd”,options));
    配置(AzureADDefaults.OpenIdScheme,选项=>{
    options.signnscheme=IdentityConstants.ExternalScheme;
    //其他配置
    });
    

    然后,您可以构建asp.net标识并根据需要进行修改,在任何页面中触发外部登录(
    ExternalLogin.cshtml.cs
    中的
    OnPost
    函数),就像默认模板(“蓝色大按钮”)一样

    让我说对了,你的意思是你不想要默认项目提供的单一登录功能,你想让你的用户得到AzureAD的提示?因为你要求。。。我有一个现有的应用程序,允许客户创建帐户(本地用户,存储在SQL Server中)。我想提供一个页面,让我的员工通过Azure广告登录。因此,我对自己说,我所需要做的就是将AzureAD连接成一个“外部提供商”(而不是Facebook或谷歌)。一旦我开始工作,我只需从登录页面中删除“蓝色大按钮”,并将“外部登录”代码移动到专用页面。但我无法让AzureAD作为外部登录提供商很好地使用内置身份页。我认为您不能“不”指定默认方案,因为登录管理器不知道要使用哪个方案以及您的HttpContext。用户永远不会被分配到。来自微软文档;如果以下任一项为真,请定义默认方案:a)希望用户自动登录。b) 您可以使用[Authorize]属性或授权策略,而不指定方案。这里的关键是,您可能尚未在authorize属性上指定方案以使其正常工作。您还可以尝试添加
    services.AddAuthentication(sharedOptions=>{sharedOptions.DefaultScheme=CookieAuthenticationDefaults.AuthenticationScheme;sharedOptions.DefaultChallengeScheme=OpenIdConnectDefaults.AuthenticationScheme;})
    这可能会奏效。您不想让用户选择使用Azure AD或asp.net标识登录标识的默认登录页面,而是想使用自定义登录页面?
    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    
    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => {
        options.SignInScheme= IdentityConstants.ExternalScheme;
    
        //other config
    });