使用Azure AD进行身份验证和授权

在之前的帖子中,已经看到了如何使用自定义登录/注销页面、Cookie认证、JWT、ASP.NET Identity和IdentityServer4来保护应用程序。在这篇文章和下一篇文章中,将展示如何使用Azure AD将身份和访问管理委托给Azure,从而简化应用程序。

配置Azure AD

首先,需要创建一个Azure订阅(免费开始,可以获得一定的信用额度)。然后,创建一个新的资源并搜索“Azure Active Directory”:

创建新的实例,并输入详细信息,包括唯一的“初始域名”。这将成为应用程序中使用的租户名称,例如,下面的租户名称将是fiverad.onmicrosoft.com:

一旦目录创建完成,需要注册应用程序。输入应用程序的详细信息,包括应用程序主页/登录页面的URL:

创建应用程序后,将在列表中看到“应用程序ID”。这将作为应用程序中的“客户端ID”:

点击应用程序,然后点击“回复URL”,输入Azure AD在认证后将用户重定向的URL(例如:https://localhost:44308/security/signin-callback):

接下来,将在Azure AD中创建一个用户。请注意,用户名基于目录的域名,例如@fiverad.onmicrosoft.com。同时,请记下临时密码,需要在首次登录时更改它:

到目前为止,已经完成了以下操作:

  • 创建了Azure AD
  • 注册了应用程序
  • 添加了一个用户

接下来,将设置应用程序,并使用Azure AD对用户进行身份验证

配置应用程序

创建一个空项目,并更新Startup.cs以配置MVC和身份验证的服务和中间件:

public class Startup { private readonly string TenantName = "初始域名"; private readonly string ClientId = "应用程序ID"; public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddOpenIdConnect(options => { options.Authority = "https://login.microsoftonline.com/" + this.TenantName; options.ClientId = this.ClientId; options.ResponseType = OpenIdConnectResponseType.IdToken; options.CallbackPath = "/security/signin-callback"; options.SignedOutRedirectUri = "https://localhost:44308/"; }) .AddCookie(); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseAuthentication(); app.UseMvcWithDefaultRoute(); } }

在这里,设置了Open ID Connect认证中间件服务,包括:

  • Authority:指向设置的Azure AD租户的路径,作为认证服务器
  • ClientId:Azure AD为应用程序提供的应用程序标识符
  • ResponseType:确定授权流程使用的值和从服务器返回的参数。目前只对授权令牌感兴趣
  • CallbackPath:服务器在认证后将重定向到的路径。不需要在应用程序中创建这个,中间件将处理这个
  • SignedOutRedirectUri:服务器在注销后将重定向到的路径。例如,这是应用程序的主页路径

在配置认证中间件时,还指定了Open ID Connect作为挑战方案。这是ASP.NET Core将用于尚未登录用户的中间件。

登录后,希望将他们的身份存储在cookie中,而不是每次请求都重定向到认证服务器。因此,添加了cookie认证中间件,并将其作为默认登录方案。如果缺少cookie,用户将被“挑战”他们的身份。

添加一个控制器来实现登录/注销操作:

public class SecurityController : Controller { public IActionResult Login() { return Challenge(new AuthenticationProperties { RedirectUri = "/" }); } [HttpPost] public async Task Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme); } }

注销时,重要的是从认证服务器(Azure AD)注销,并通过从cookie认证方案注销来移除cookie。

[Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485