快速入门:从 ASP.NET Web 应用登录用户并调用 Microsoft Graph API
在本快速入门中,你将下载并运行一个代码示例,该示例演示 ASP.NET Web 应用程序如何使用 Microsoft Entra 帐户让用户登录。
有关说明,请参阅示例工作原理。
先决条件
- 具有活动订阅的 Azure 帐户。 创建帐户。
- Visual Studio 2022
- .NET Framework 4.7.2+
注册和下载应用
提示
本文中的步骤可能因开始使用的门户而略有不同。
可以通过两种方法开始生成应用程序:自动或手动配置。
自动配置
如果要自动配置应用,然后下载代码示例,请执行以下步骤:
- 至少以云应用程序管理员身份登录到 Microsoft Entra 管理中心快速入门体验。
- 输入应用程序的名称并选择“注册”。
- 遵循说明下载内容,并一键自动配置新应用程序。
手动配置
如果要手动配置应用程序和代码示例,请执行以下过程。
步骤 1:注册应用程序
- 至少以云应用程序管理员身份登录到 Microsoft Entra 管理中心。
- 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你希望在其中注册应用程序的租户。
- 浏览至“标识”>“应用程序”>“应用注册”,选择“新建注册”。
- 对于“名称”,请输入应用程序名称。 例如,输入 ASPNET-Quickstart。 应用的用户会看到此名称,你稍后可对其进行更改。
- 将“重定向 URI”类型设置为 Web 并将值设置为
https://localhost:44368/
。 - 选择“注册” 。
- 在“管理”下,选择“身份验证”。
- 在“隐式授权和混合流”部分,选择“ID 令牌” 。
- 选择“保存”。
步骤 2:下载项目
提示
若要避免由于 Windows 中路径长度限制导致的错误,我们建议将存档提取或克隆到驱动器根目录附近的目录中。
步骤 3:运行项目
将 .zip 文件解压缩到根文件夹附近的本地文件夹中。 例如,解压到 C:\Azure-Samples。
建议将存档解压到驱动器根附近的目录中,以避免在 Windows 上出现路径长度限制导致的错误。
在 Visual Studio 中打开解决方案 (AppModelv2-WebApp-OpenIDConnect-DotNet.sln)。
可能需要右键单击项目“AppModelv2-WebApp-OpenIDConnect-DotNet”,然后选择“还原 NuGet 包”,具体取决于 Visual Studio 的版本 。
通过选择“查看”>“其他 Windows”>“包管理器控制台”,打开包管理器控制台 。 然后运行
Update-Package
。编辑 appsettings.json,将参数
ClientId
、Tenant
和redirectUri
替换为:"ClientId" :"Enter_the_Application_Id_here" /> "TenantId": "Enter_the_Tenant_Info_Here" /> "RedirectUri" :"https://localhost:44368/" />
在该代码中:
Enter_the_Application_Id_here
是先前创建的应用注册的应用程序(客户端)ID。 在 Microsoft Entra 管理中心的“应用注册”中的应用“概述”页上找到应用程序(客户端)ID。Enter_the_Tenant_Info_Here
是以下选项之一:- 如果应用程序支持“仅我的组织”,请将该值替换为目录(租户)ID 或租户名称(例如
contoso.partner.onmschina.cn
)。 在 Microsoft Entra 管理中心的“应用注册”中的应用“概述”页上找到目录(租户)ID。 - 如果应用程序支持“任何组织目录中的帐户”,请将该值替换为
organizations
。
- 如果应用程序支持“仅我的组织”,请将该值替换为目录(租户)ID 或租户名称(例如
redirectUri
是你先前在 Microsoft Entra 管理中心的“应用注册”中输入的重定向 URI。
更多信息
本部分概述了使用户登录所需的代码。 此概述对于了解代码的工作原理、主要参数是什么,以及如何向现有 ASP.NET 应用程序添加登录非常有用。
示例工作原理
OWIN 中间件 NuGet 包
可以将 ASP.NET 中的 OpenID Connect 与 OWIN 中间件包配合使用,通过基于 Cookie 的身份验证设置身份验证管道。 可在 Visual Studio 的包管理器控制台中运行以下命令,以便安装这些包:
Install-Package Microsoft.Identity.Web.Owin
Install-Package Microsoft.Identity.Web.GraphServiceClient
Install-Package Microsoft.Owin.Security.Cookies
OWIN 启动类
OWIN 中间件使用在托管进程初始化时运行的“启动类”。 在本快速入门中,startup.cs 文件位于根文件夹下。 以下代码显示本快速入门使用的参数:
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
OwinTokenAcquirerFactory factory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
app.AddMicrosoftIdentityWebApp(factory);
factory.Services
.Configure<ConfidentialClientApplicationOptions>(options => { options.RedirectUri = "https://localhost:44368/"; })
.AddMicrosoftGraph()
.AddInMemoryTokenCaches();
factory.Build();
}
Where | 说明 |
---|---|
ClientId |
Azure 门户中注册的应用程序的应用程序 ID。 |
Authority |
用户进行身份验证时使用的安全令牌服务 (STS) 终结点。 对于公共云,通常为 https://login.partner.microsoftonline.cn/{tenant}/v2.0 。 在该 URL 中,{tenant} 是租户名称、租户 ID,或 common 是对常用终结点的引用。 (常用终结点用于多租户应用程序。) |
RedirectUri |
一个 URL,在通过 Microsoft 标识平台进行身份验证之后,会将用户发送到此 URL。 |
PostLogoutRedirectUri |
一个 URL,在注销以后,会将用户发送到此 URL。 |
Scope |
请求的作用域的列表,使用空格进行分隔。 |
ResponseType |
来自身份验证响应的请求包含授权代码和 ID 令牌。 |
TokenValidationParameters |
用于令牌验证的参数列表。 在这种情况下,ValidateIssuer 设置为 false ,以指示它可以接受来自任何工作或学校帐户类型的登录。 |
Notifications |
可以在 OpenIdConnect 消息上运行的委托的列表。 |
身份验证质询
可以通过在控制器中请求身份验证质询,强制用户登录:
public void SignIn()
{
if (!Request.IsAuthenticated)
{
HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties{ RedirectUri = "/" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
提示
使用此方法请求身份验证质询是可选的。 如果希望已经身份验证和未经身份验证用户都可以访问视图,通常会使用此方法。 或者,可以使用下一节中所述的方法来保护控制器。
用于保护控制器或控制器操作的属性
可以使用 [Authorize]
属性保护控制器或控制器操作。 此属性通过仅允许经过身份验证的用户访问控制器中的操作来限制对控制器或操作的访问。 当未经身份验证的用户尝试访问由 [Authorize]
属性修饰的某个操作或控制器时,将自动发生身份验证质询。
从控制器调用 Microsoft Graph
可以从控制器调用 Microsoft Graph,方法是使用控制器上的 GetGraphServiceClient
扩展方法获取 GraphServiceClient 的实例,如以下代码所示:
try
{
var me = await this.GetGraphServiceClient().Me.GetAsync();
ViewBag.Username = me.DisplayName;
}
catch (ServiceException graphEx) when (graphEx.InnerException is MicrosoftIdentityWebChallengeUserException)
{
HttpContext.GetOwinContext().Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType);
return View();
}
帮助和支持
如果需要帮助、需要报告问题,或者需要详细了解支持选项,请参阅面向开发人员的帮助和支持。
后续步骤
试用 ASP.NET 教程,了解有关构建应用程序和新功能的完整分步指南,包括本快速入门的完整说明。