在之前的帖子中,已经看到了如何使用自定义登录/注销页面、Cookie认证、JWT、ASP.NET Identity和IdentityServer4来保护应用程序。在这篇文章和下一篇文章中,将展示如何使用Azure AD将身份和访问管理委托给Azure,从而简化应用程序。
首先,需要创建一个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对用户进行身份验证。
创建一个空项目,并更新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认证中间件服务,包括:
在配置认证中间件时,还指定了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();
}
}