在启用Windows身份验证的情况下调用Web API端点时出现401.1错误

时间:2019-01-22 17:28:06

标签: c# iis asp.net-core windows-authentication asp.net-core-webapi

场景: 我们有一个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;
}

0 个答案:

没有答案