使用 ASP.NET Core 的 Microsoft 帐户外部登录设置Microsoft Account external login setup with ASP.NET Core

本文内容

作者:Valeriy NovytskyyRick Anderson

此示例演示如何使用户能够使用在前一页上创建的 ASP.NET Core 3.0 项目使用其 Microsoft 帐户进行登录。

在 Microsoft 开发人员门户中创建应用Create the app in Microsoft Developer Portal

如果没有 Microsoft 帐户,请选择 "创建"。登录后,会重定向到应用注册页面:

  • 选择新注册
  • 输入“名称”。
  • 支持的帐户类型选择一个选项。
  • 在 "重定向 URI" 下,输入 /signin-microsoft 追加的开发 URL。例如 https://localhost:5001/signin-microsoft。稍后在本示例中配置的 Microsoft 身份验证方案将自动处理 /signin-microsoft 路由中的请求以实现 OAuth 流。
  • 选择注册

创建客户端密码Create client secret

  • 在左侧窗格中,选择 "证书" & "机密"。

  • 在 "客户端密码" 下,选择新的客户端密码

    • 添加客户端密码的说明。
    • 选择“添加”按钮。
  • 在 "客户端密码" 下,复制 "客户端密钥" 的值。

备注

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

存储 Microsoft 客户端 ID 和机密Store the Microsoft client ID and secret

机密管理器存储敏感设置,如 Microsoft 客户端 ID 和机密值。对于本示例,请使用以下步骤:

  • 按照启用密钥存储中的说明初始化密钥存储的项目。

  • 将敏感设置存储在本地密钥存储中,并将机密密钥 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret

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

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

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

配置 Microsoft 帐户身份验证Configure Microsoft Account Authentication

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<ApplicationDbContext>(options =>
  4. options.UseSqlServer(
  5. Configuration.GetConnectionString("DefaultConnection")));
  6. services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
  7. .AddEntityFrameworkStores<ApplicationDbContext>();
  8. services.AddRazorPages();
  9. services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
  10. {
  11. microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
  12. microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
  13. });
  14. }

AddAuthentication (字符串)重载设置DefaultScheme属性。AddAuthentication (Action<AuthenticationOptions>)重载允许配置身份验证选项,这些选项可用于为不同目的设置默认的身份验证方案。对的后续调用 AddAuthentication 重写以前配置的AuthenticationOptions属性。

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

多个身份验证提供程序Multiple authentication providers

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

  1. services.AddAuthentication()
  2. .AddMicrosoftAccount(microsoftOptions => { ... })
  3. .AddGoogle(googleOptions => { ... })
  4. .AddTwitter(twitterOptions => { ... })
  5. .AddFacebook(facebookOptions => { ... });

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

Microsoft 登录帐户Sign in with Microsoft Account

运行应用程序,并单击 "登录"此时会显示一个用于使用 Microsoft 登录的选项。当你单击 "Microsoft" 时,你将重定向到 Microsoft 进行身份验证。使用你的 Microsoft 帐户登录后,系统会提示你让应用访问你的信息:

点击 "是" ,你会被重定向回到网站,你可以在其中设置电子邮件。

你现在已使用 Microsoft 凭据登录:

使用代理或负载均衡器转发请求信息Forward request information with a proxy or load balancer

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

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

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

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

故障排除Troubleshooting

  • 如果 Microsoft 帐户提供程序将您重定向到登录错误页,请记下 Uri 中的 # (井号)后面的错误标题和说明查询字符串参数。

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

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

  • 如果尚未通过应用初始迁移来创建站点数据库,则在处理请求错误时将会获得数据库操作失败。点击 "应用迁移" 以创建数据库,然后单击 "刷新" 以继续出现错误。

后续步骤Next steps

  • 本文演示了如何向 Microsoft 进行身份验证。您可以遵循类似的方法向前一页上列出的其他提供程序进行身份验证。

  • 将网站发布到 Azure web 应用后,在 Microsoft 开发人员门户中创建新的客户端密码。

  • Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret 设置为 Azure 门户中的应用程序设置。配置系统设置以从环境变量读取密钥。