使用 ASP.NET Core 进行的 Microsoft 帐户外部登录设置

作者:Valeriy NovytskyyRick Anderson

此示例演示如何使用户能够使用在上一页中创建的 ASP.NET Core 6.0 项目,通过其工作、学校或个人 Microsoft 帐户登录。

在 Microsoft 开发人员门户中创建应用

如果没有 Microsoft 帐户,请选择“创建一个”。 登录后,你将被重定向到“应用注册”页面:

  • 选择“新建注册”
  • 输入“名称”。
  • 为“支持的帐户类型”选择一个选项。
    • 默认情况下,MicrosoftAccount 包支持使用“任何组织目录中的帐户”或“任何组织目录中的帐户和 Microsoft 帐户”选项创建的应用注册。
    • 若要使用其他选项,请将用于初始化 Microsoft 帐户身份验证的 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 成员设置为创建应用注册后其“终结点”页面上显示的 URL(可通过单击“概述”页面上的“终结点”获得)。
  • 在“重定向 URI”下,输入你的开发 URL,并附加 /signin-microsoft。 例如,https://localhost:5001/signin-microsoft。 本示例稍后配置的 Microsoft 身份验证方案将自动处理 /signin-microsoft 路由中的请求以实现 OAuth 流。
  • 选择“注册”

创建客户端机密

  • 在左窗格中,选择“证书和密码”
  • 在“客户端密码”下,选择“新建客户端密码”
    • 添加客户端密码的说明。
    • 选择“添加”按钮。
  • 在“客户端密码”下,复制客户端密码的值。

URI 段 /signin-microsoft 设为 Microsoft 身份验证提供程序的默认回叫。 你可以更改默认回叫 URI,同时通过 MicrosoftAccountOptions 类的继承 RemoteAuthenticationOptions.CallbackPath 属性配置 Microsoft 身份验证中间件。

存储 Microsoft 客户端 ID 和机密

存储敏感设置,例如在应用注册的“概述”页面上找到的“Microsoft 应用程序(客户端) ID”,以及你使用机密管理器在“证书和机密”页面上创建的“客户端机密”。 对于此示例,请执行以下步骤:

  1. 按照启用机密存储中的说明初始化项目,以存储机密。

  2. 使用机密密钥 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret 将敏感设置存储到本地机密存储:

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
    

所有平台上的环境变量分层键都不支持 : 分隔符。 __(双下划线):

  • 受所有平台支持。 例如,Bash 不支持 : 分隔符,但支持 __
  • 自动替换为 :

配置 Microsoft 帐户身份验证

将身份验证服务添加到 Program

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = configuration["Authentication:Microsoft:ClientSecret"];
    });

AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 通过 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载可配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication 的后续调用会替代之前配置的 AuthenticationOptions 属性。

注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。

有关 Microsoft 帐户身份验证支持的配置选项的详细信息,请参阅 MicrosoftAccountOptions API 参考。 这可用于请求有关用户的各种信息。

使用 Microsoft 帐户登录

  • 运行应用并选择“登录”。 随即将显示一个使用 Microsoft 登录的选项。
  • 选择该选项,以使用 Microsoft 登录。 你将重定向到 Microsoft 进行身份验证。 使用你的 Microsoft 帐户登录后,系统将提示你允许该应用访问你的信息:
  • 选择 “是” 。 你将重定向到可在其中设置电子邮件的网站。

你现在使用 Microsoft 凭据登录。

多个身份验证提供程序

如果应用需要多个提供程序,请在 AddAuthentication 后面链接提供程序扩展方法:

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

使用代理或负载均衡器转发请求信息

如果应用部署在代理服务器或负载均衡器后面,则可能会将某些原始请求信息转发到请求标头中的应用。 此信息通常包括安全请求方案 (https)、主机和客户端 IP 地址。 应用不会自动读取这些请求标头以发现和使用原始请求信息。

方案用于通过外部提供程序影响身份验证流的链接生成。 丢失安全方案 (https) 会导致应用生成不正确且不安全的重定向 URL。

使用转发标头中间件以使应用可以使用原始请求信息来进行请求处理。

有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器

疑难解答

  • 如果 Microsoft 帐户提供程序将你重定向到登录错误页面,请注意 URI 中直接跟在 #(井号标签)之后的错误标题和说明查询字符串参数。

    尽管错误消息似乎表明 Microsoft 身份验证存在问题,但最常见的原因是应用程序 URI 与为 Web 平台指定的任何“重定向 URI”均不匹配。

  • 如果未通过在 ConfigureServices 中调用 services.AddIdentity 来配置 Identity,则尝试进行身份验证将导致“ArgumentException: 必须提供‘SignInScheme’选项”。 本示例中使用的项目模板可确保完成此操作。

  • 如果未通过应用初始迁移创建站点数据库,则会显示“处理请求时数据库操作失败”错误。 点击“应用迁移”,创建数据库并刷新以绕过错误继续操作。

后续步骤

  • 本文介绍了如何向 Microsoft 进行身份验证。 可以按照类似的方法向上一页中列出的其他提供程序进行身份验证。
  • 将网站发布到 Azure web 应用后,在 Microsoft 开发人员门户中创建新的客户端密码。
  • 在 Azure 门户中将 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret 设置为应用程序设置。 配置系统设置为从环境变量读取密钥。

此示例演示如何使用户能够使用在上一页中创建的 ASP.NET Core 3.0 项目,通过其工作、学校或个人 Microsoft 帐户登录。

在 Microsoft 开发人员门户中创建应用

如果没有 Microsoft 帐户,请选择“创建一个”。 登录后,你将被重定向到“应用注册”页面:

  • 选择“新建注册”
  • 输入“名称”。
  • 为“支持的帐户类型”选择一个选项。
    • 默认情况下,MicrosoftAccount 包支持使用“任何组织目录中的帐户”或“任何组织目录中的帐户和 Microsoft 帐户”选项创建的应用注册。
    • 若要使用其他选项,请将用于初始化 Microsoft 帐户身份验证的 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 成员设置为创建应用注册后其“终结点”页面上显示的 URL(可通过单击“概述”页面上的“终结点”获得)。
  • 在“重定向 URI”下,输入你的开发 URL,并附加 /signin-microsoft。 例如,https://localhost:5001/signin-microsoft。 本示例稍后配置的 Microsoft 身份验证方案将自动处理 /signin-microsoft 路由中的请求以实现 OAuth 流。
  • 选择“注册”

创建客户端机密

  • 在左窗格中,选择“证书和密码”
  • 在“客户端密码”下,选择“新建客户端密码”
    • 添加客户端密码的说明。
    • 选择“添加”按钮。
  • 在“客户端密码”下,复制客户端密码的值。

URI 段 /signin-microsoft 设为 Microsoft 身份验证提供程序的默认回叫。 你可以更改默认回叫 URI,同时通过 MicrosoftAccountOptions 类的继承 RemoteAuthenticationOptions.CallbackPath 属性配置 Microsoft 身份验证中间件。

存储 Microsoft 客户端 ID 和机密

存储敏感设置,例如在应用注册的“概述”页面上找到的“Microsoft 应用程序(客户端) ID”,以及你使用机密管理器在“证书和机密”页面上创建的“客户端机密”。 对于此示例,请执行以下步骤:

  1. 按照启用机密存储中的说明初始化项目,以存储机密。

  2. 使用机密密钥 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret 将敏感设置存储到本地机密存储:

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
    

所有平台上的环境变量分层键都不支持 : 分隔符。 __(双下划线):

  • 受所有平台支持。 例如,Bash 不支持 : 分隔符,但支持 __
  • 自动替换为 :

配置 Microsoft 帐户身份验证

将 Microsoft 帐户服务添加到 Startup.ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
    });
}

AddAuthentication(IServiceCollection, String) 重载设置 DefaultScheme 属性。 通过 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 重载可配置身份验证选项,这些选项可用于为不同的目的设置默认身份验证方案。 对 AddAuthentication 的后续调用会替代之前配置的 AuthenticationOptions 属性。

注册身份验证处理程序的 AuthenticationBuilder 扩展方法只能在每个身份验证方案中调用一次。 存在允许配置方案属性、方案名称和显示名称的重载。

有关 Microsoft 帐户身份验证支持的配置选项的详细信息,请参阅 MicrosoftAccountOptions API 参考。 这可用于请求有关用户的各种信息。

使用 Microsoft 帐户登录

运行应用并选择“登录”。 随即将显示一个使用 Microsoft 登录的选项。 选择“Microsoft”时,你会重定向到 Microsoft 进行身份验证。 使用你的 Microsoft 帐户登录后,系统将提示你允许该应用访问你的信息:

点击“是”,你将重定向到可在其中设置电子邮件的网站。

你现在使用 Microsoft 凭据登录。

多个身份验证提供程序

如果应用需要多个提供程序,请在 AddAuthentication 后面链接提供程序扩展方法:

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

使用代理或负载均衡器转发请求信息

如果应用部署在代理服务器或负载均衡器后面,则可能会将某些原始请求信息转发到请求标头中的应用。 此信息通常包括安全请求方案 (https)、主机和客户端 IP 地址。 应用不会自动读取这些请求标头以发现和使用原始请求信息。

方案用于通过外部提供程序影响身份验证流的链接生成。 丢失安全方案 (https) 会导致应用生成不正确且不安全的重定向 URL。

使用转发标头中间件以使应用可以使用原始请求信息来进行请求处理。

有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器

疑难解答

  • 如果 Microsoft 帐户提供程序将你重定向到登录错误页面,请注意 URI 中直接跟在 #(井号标签)之后的错误标题和说明查询字符串参数。

    尽管错误消息似乎表明 Microsoft 身份验证存在问题,但最常见的原因是应用程序 URI 与为 Web 平台指定的任何“重定向 URI”均不匹配。

  • 如果未通过在 ConfigureServices 中调用 services.AddIdentity 来配置 Identity,则尝试进行身份验证将导致“ArgumentException: 必须提供‘SignInScheme’选项”。 本示例中使用的项目模板可确保完成此操作。

  • 如果未通过应用初始迁移创建站点数据库,则会显示“处理请求时数据库操作失败”错误。 点击“应用迁移”,创建数据库并刷新以绕过错误继续操作。

后续步骤

  • 本文介绍了如何向 Microsoft 进行身份验证。 可以按照类似的方法向上一页中列出的其他提供程序进行身份验证。
  • 将网站发布到 Azure web 应用后,在 Microsoft 开发人员门户中创建新的客户端密码。
  • 在 Azure 门户中将 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret 设置为应用程序设置。 配置系统设置为从环境变量读取密钥。