场景: 我们有一个ASP.NET Core Web应用程序以及ASP.NET Core Web.API服务。它们托管在同一台服务器(Windows 2016)和同一域中,尽管它们位于不同的网站下(我们有一个用于服务,一个用于应用程序)。这是一个Intranet类型的应用程序,我们希望能够将Windows凭据从客户端用户传递到应用程序,也可以作为API调用的一部分。
我已经为应用程序以及IIS中的服务启用了Windows身份验证。我目前无法通过应用程序代码调用web.api端点时获得401.1。我可以在Web浏览器中浏览该应用程序以及api。
API代码:
在Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
}
在ValuesController.cs
中[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {"value1", "value2" };
}
}
应用程序代码:
在Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
使用RestSharp的函数调用(尽管HttpWebRequest也给出401)
private string GetRestResponse(string endpoint)
{
var client = new RestClient(endpoint);
var request = new RestRequest(Method.GET);
request.UseDefaultCredentials = true;
request.AddHeader("content-type", "application/json");
IRestResponse response = client.Execute(request);
return response.Content;
}