Windows .NET Core Web 中的身份验证 API / Angular 应用程序
Windows Authentication in .NET Core Web API / Angular application
我正在使用 Visual Studio 2019 Community 构建 Intranet 应用程序以创建 .NET Core Web Api(使用 .NET Core 2.2)和 Visual Studio 创建代码 Angular 前端(@angular/cdk 7.1.0,@angular/cli 7.0.6,@angular/material 7.1.0)。
由于是内网应用,所以想实现windows认证,这样用户就不用再输入凭据了。
我声明我已经尝试过这个和其他论坛但没有成功,我对这些技术不是很熟悉所以我需要帮助来解决我遇到的一些问题,我可能不明白 CORS 是如何工作的。
我也尝试从 postman 调用我的网络 API(默认设置 = "Authorization: Inherit auth from parent"...),但结果相同。
我已经从 NuGet 安装了 Microsoft.AspNetCore.Cors 并实现了以下代码。
在网络上 API 我有这段代码。
launchSettings.json
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:62148",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApiWinAuth": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin",
options => options
.AllowAnyOrigin()
//.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
);
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
var resolver = options.SerializerSettings.ContractResolver;
if (resolver != null)
(resolver as DefaultContractResolver).NamingStrategy = null;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(options => options
.AllowAnyOrigin()
//.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
);
app.UseMvc();
}
ValuesController.cs
[Route("api/[controller]")]
[ApiController]
[Authorize]
[EnableCors("AllowOrigin")]
public class ValuesController : ControllerBase
{
// GET api/values
[EnableCors("AllowOrigin")]
[HttpGet]
[Authorize]
public ActionResult<string> Get()
{
var userId = HttpContext.User.Identity.Name;
return userId;
}
}
在angular这边我有这个代码。
identity.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class IdentityService {
constructor(private http:HttpClient) { }
getCurrentUser() {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
}),
withCredentials: true
};
return this.http.get('http://localhost:62148/api/values', httpOptions)
.toPromise();
}
}
app.component.ts
export class AppComponent implements OnInit {
title = 'Angular WinAuth';
currentUser:string;
constructor(private service: IdentityService) { }
ngOnInit() {
this.service.getCurrentUser().then(res => this.currentUser = res as string);
}
}
我不断收到的响应是来自 Postman 和 angular 应用程序的 "HTTP Error 401.2 - Unauthorized"。
我哪里做错了?
如何实现angular对WebApi的调用?
如果我必须 post 请告诉我另一个代码。
提前致谢
我是 .Net Core 的新手,在使用 Windows 身份验证时遇到了类似的问题。我检查了很多帖子,但 none 提供了解决方案。 MVC 4 或 5 对 applicationhost.config 的更改解决了类似问题。
我发现如果我更改我的端口,应用程序将以调试模式启动,并且 Window 身份验证将正常工作。第二次启动应用程序时,我将收到 401.1 或 401.2 错误。
我后来转而使用 Chrome 进行开发,它似乎工作正常。这并不理想,因为我们的企业用户群在 IE 或 Edge 上。
当我在 launchSettings.json
中设置 anonymousAuthentication:true
时有效:
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:62148",
"sslPort": 0
}
并且从 asp.net 核心中的 Windows Authentication and CORS 引入,我将 startup.cs 更改如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);//Add this line
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin",
options => options
//.AllowAnyOrigin()
.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()//Add this line
);
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
var resolver = options.SerializerSettings.ContractResolver;
if (resolver != null)
(resolver as DefaultContractResolver).NamingStrategy = null;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseCors("AllowOrigin");
app.UseMvc();
}
}
我正在使用 Visual Studio 2019 Community 构建 Intranet 应用程序以创建 .NET Core Web Api(使用 .NET Core 2.2)和 Visual Studio 创建代码 Angular 前端(@angular/cdk 7.1.0,@angular/cli 7.0.6,@angular/material 7.1.0)。 由于是内网应用,所以想实现windows认证,这样用户就不用再输入凭据了。 我声明我已经尝试过这个和其他论坛但没有成功,我对这些技术不是很熟悉所以我需要帮助来解决我遇到的一些问题,我可能不明白 CORS 是如何工作的。
我也尝试从 postman 调用我的网络 API(默认设置 = "Authorization: Inherit auth from parent"...),但结果相同。 我已经从 NuGet 安装了 Microsoft.AspNetCore.Cors 并实现了以下代码。
在网络上 API 我有这段代码。
launchSettings.json
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:62148",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApiWinAuth": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin",
options => options
.AllowAnyOrigin()
//.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
);
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
var resolver = options.SerializerSettings.ContractResolver;
if (resolver != null)
(resolver as DefaultContractResolver).NamingStrategy = null;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(options => options
.AllowAnyOrigin()
//.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
);
app.UseMvc();
}
ValuesController.cs
[Route("api/[controller]")]
[ApiController]
[Authorize]
[EnableCors("AllowOrigin")]
public class ValuesController : ControllerBase
{
// GET api/values
[EnableCors("AllowOrigin")]
[HttpGet]
[Authorize]
public ActionResult<string> Get()
{
var userId = HttpContext.User.Identity.Name;
return userId;
}
}
在angular这边我有这个代码。
identity.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class IdentityService {
constructor(private http:HttpClient) { }
getCurrentUser() {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
}),
withCredentials: true
};
return this.http.get('http://localhost:62148/api/values', httpOptions)
.toPromise();
}
}
app.component.ts
export class AppComponent implements OnInit {
title = 'Angular WinAuth';
currentUser:string;
constructor(private service: IdentityService) { }
ngOnInit() {
this.service.getCurrentUser().then(res => this.currentUser = res as string);
}
}
我不断收到的响应是来自 Postman 和 angular 应用程序的 "HTTP Error 401.2 - Unauthorized"。
我哪里做错了? 如何实现angular对WebApi的调用?
如果我必须 post 请告诉我另一个代码。 提前致谢
我是 .Net Core 的新手,在使用 Windows 身份验证时遇到了类似的问题。我检查了很多帖子,但 none 提供了解决方案。 MVC 4 或 5 对 applicationhost.config 的更改解决了类似问题。
我发现如果我更改我的端口,应用程序将以调试模式启动,并且 Window 身份验证将正常工作。第二次启动应用程序时,我将收到 401.1 或 401.2 错误。
我后来转而使用 Chrome 进行开发,它似乎工作正常。这并不理想,因为我们的企业用户群在 IE 或 Edge 上。
当我在 launchSettings.json
中设置 anonymousAuthentication:true
时有效:
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:62148",
"sslPort": 0
}
并且从 asp.net 核心中的 Windows Authentication and CORS 引入,我将 startup.cs 更改如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);//Add this line
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin",
options => options
//.AllowAnyOrigin()
.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()//Add this line
);
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
var resolver = options.SerializerSettings.ContractResolver;
if (resolver != null)
(resolver as DefaultContractResolver).NamingStrategy = null;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseCors("AllowOrigin");
app.UseMvc();
}
}