这就是我使用的,我希望它适合你的情况。
我的startup.cs ConfigureServices() 装饰有:
services.AddCors(feature =>
feature.AddPolicy(
"CorsPolicy",
apiPolicy => apiPolicy
//.AllowAnyOrigin()
//.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()
.SetIsOriginAllowed(host => true)
.AllowCredentials()
));
并且,Configure() 方法具有:
app.UseCors("CorsPolicy");
请注意 SetIsOriginAllowed() 和 allowedCreds() 以及其他策略设置,这对我来说适用于从我的角度对我的 api 进行 POST 调用,这些角度在两个不同的端口号上运行。
UPDATE:
在评论中提出问题之后,添加有关如何检查登录用户(windows auth)btwn api 和 Angular(前端)的附加信息。
您可以检查特定路由上的传入用户,该路由仅期望使用装饰 [Authorize] 进行身份验证的用户。就我而言,我只有一种方法需要 Windows 用户在 api 中:
[HttpGet("UserInfo")]
[Authorize]
public IActionResult GetUserInfo()
{
string defaultCxtUser = HttpContext?.User?.Identity?.Name;
if (defaultCxtUser != null && !string.IsNullOrEmpty(defaultCxtUser))
{
_logger.LogDebug($"START - Get Context user details for {defaultCxtUser}");
ADHelper.logger = _logger;
var userFullName = ADHelper.GetUserIdentityInfo(defaultCxtUser);
_logger.LogInformation($"Context user {defaultCxtUser} with name: {userFullName}");
var userInfo = new { Name = userFullName };
//_logger.LogDebug($"END - GetUserInfo({defaultCxtUser} for {userFullName}");
return Ok(userInfo);
}
else
return Ok(new { Name = defaultCxtUser });
}
然后我会从我的角度将其称为服务调用,
// Get the Logged in user info
GetCurrentUserInfo(): Observable<string> {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
}),
withCredentials: true
};
// return this.http.get<string>(`${ApiPath}UserInfo`, httpOptions)
// .pipe(map(v => v as string));
return this.http.get<UserInfo>(`${ApiPath}UserInfo`, httpOptions)
.pipe(map(data => {
// console.log(data, data.Name);
return data.Name;
}))
;
}
请参阅带有“withCredentials: true”行的标头,该行将触发传递当前用户信息,并且只有当它具有在 C# 端读取 User.Identity 对象的授权 attr 时才会读取和理解它。我们在特定方法上执行此操作的原因是,api 中应该有一些其他父方法,例如 ApiStatus() 或任何可能的方法,应该首先调用。这将确保还使用需要匿名身份验证的选项来调用预检检查。就像我的例子一样,在从我的角度应用程序获取 userInfo() 之前,先获取 api 是否可用并正在运行,以及其他一些应用程序环境信息。