在本文中,将探讨如何在.NET Core Web API项目中启用Windows身份验证,并将其与Angular前端应用程序集成。Windows身份验证是一种安全机制,允许用户使用其Windows凭据访问Web应用程序。将逐步介绍如何配置后端和前端,以确保无缝的身份验证体验。
首先,需要在.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中,添加了一个名为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安装了.NET Core Hosting Bundle,没有它,IIS无法运行.NET Core项目。
为API创建应用程序池,选择“无托管代码”:
应用程序池的“高级设置”应该禁用32位应用程序(假设在x64上运行),并将身份更新为具有服务器管理权限的用户账户:
现在可以在IIS中创建网站。对于网站,请确保启用了匿名和Windows身份验证:
对于绑定,请选择HTTPS,使用IIS Express开发证书进行测试是可以接受的: