.NET Core Web API启用Windows身份验证与Angular集成指南

在本文中,将探讨如何在.NET Core Web API项目中启用Windows身份验证,并将其与Angular前端应用程序集成。Windows身份验证是一种安全机制,允许用户使用其Windows凭据访问Web应用程序。将逐步介绍如何配置后端和前端,以确保无缝的身份验证体验。

.NET CoreWeb API中启用Windows身份验证

首先,需要在.NET Core Web API项目中启用Windows身份验证。这可以通过在IIS Express中运行API并进行相应的配置来实现。以下是详细步骤:

在IIS Express中运行API是测试设置的最简单方法。首先,需要在Startup.ConfigureServices方法中添加以下代码,以强制在API上启用Windows身份验证。如果没有以下代码,API将无法接受来自Angular的HTTP POST和PUT请求:

services.AddAuthentication(IISDefaults.AuthenticationScheme); services.AddMvc(config => { var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); config.Filters.Add(new AuthorizeFilter(policy)); });

接下来,在API项目的属性窗口中,选择“Debug”选项卡,启用SSL、匿名身份验证和Windows身份验证。可以将应用URL设置为HTTPS。

在API项目中,有一个名为AccountHelper的类,用于从HttpContext获取Windows账户名:

public class AccountHelper { public static string GetWinAuthAccount(HttpContext context) { IPrincipal p = context.User; return p.Identity.Name; } }

AccountController将通过HTTP GET请求返回Windows账户名:

[Route("api/[controller]")] [ApiController] public class AccountController : ControllerBase { [HttpGet] public string Get() { return AccountHelper.GetWinAuthAccount(HttpContext); } }

因此,如果在浏览器中访问URL,它应该返回Windows账户名。

CustomerController类也调用AccountHelper来保存添加或修改客户的用户:

[HttpPut("{id}")] public async Task> PutCustomer(int id, Customer customer) { customer.UpdatedBy = AccountHelper.GetWinAuthAccount(HttpContext); return Ok(await this.CustomerData.Update(customer)); } [HttpPost] public async Task> PostCustomer(Customer customer) { customer.UpdatedBy = AccountHelper.GetWinAuthAccount(HttpContext); return Ok(await this.CustomerData.Add(customer)); }

要设置数据库,请在appsettings.Development.json中更新数据库连接字符串,指向SQL Server。然后从命令提示符导航到API的Data文件夹,并运行以下命令,这将创建数据库和数据库中所需的对象:

dotnet ef database update -s ..\Api\Api.csproj

Angular设置

在Angular中,添加了一个名为WinAuthInterceptor的类,用于在向API发送HTTP请求时包含Windows账户凭据:

@Injectable() export class WinAuthInterceptor implements HttpInterceptor { intercept(req: HttpRequest, next: HttpHandler): Observable> { req = req.clone({ withCredentials: true }); return next.handle(req); } }

拦截器被添加到app.module.ts

providers: [{ provide: HTTP_INTERCEPTORS, useClass: WinAuthInterceptor, multi: true }], ...

还添加了一个名为AccountService的类,用于从API获取Windows账户名,以便显示给用户:

@Injectable({ providedIn: 'root' }) export class AccountService { ... get(): Observable { return this.http.get(this.url, { responseType: 'text' }); } }

TopBarComponent调用AccountService以显示Windows账户名。

在IIS中设置API

首先,确保为IIS安装了.NET Core Hosting Bundle,没有它,IIS无法运行.NET Core项目。

为API创建应用程序池,选择“无托管代码”:

应用程序池的“高级设置”应该禁用32位应用程序(假设在x64上运行),并将身份更新为具有服务器管理权限的用户账户:

现在可以在IIS中创建网站。对于网站,请确保启用了匿名和Windows身份验证:

对于绑定,请选择HTTPS,使用IIS Express开发证书进行测试是可以接受的:

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485