C# 具有授权的Web API不断提示登录

C# 具有授权的Web API不断提示登录,c#,asp.net-web-api,authorization,C#,Asp.net Web Api,Authorization,我正在尝试制作一个ASP.NET核心Web API,它使用Windows广告组进行登录。基于,我已在Startup.ConfigureServices()方法中配置了授权和身份验证: public void ConfigureServices(IServiceCollection services) { services.AddAuthorization(options => { options.AddPolicy("Reader", p

我正在尝试制作一个ASP.NET核心Web API,它使用Windows广告组进行登录。基于,我已在
Startup.ConfigureServices()
方法中配置了授权和身份验证:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.AddPolicy("Reader", policy => policy.RequireRole(@"<DOMAIN>\<AD_ROLE_NAME>"));
    });

    services
        .AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();

    services.AddControllers();
}
如果我使用运行API(从VisualStudio),它似乎可以正常工作。但是,如果我将其更改为与API同名的执行方法(我想是?),那么它会不断提示我登录

我如何让它与Kestrel(或其他选择)一起工作


您需要通过配置方法在HTTP管道中配置身份验证和授权:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    .
    .
    app.UseAuthentication(); // You need to setup the authentication before the authorization
    app.UseAuthorization();
    .
    .
}
ConfigureServices
中,您已经使用
.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
添加了身份验证。在这个方法中,用于注册服务的顺序并不重要,因为我们只是为DI提供者添加注册

Configure
中,顺序很重要,因为我们配置了HTTP管道,因此如果在另一个中间件之前添加了一个中间件,那么它也会在另一个之前执行

授权通过检查经过身份验证的用户的角色来工作,因此我们确实需要确保身份验证过程在授权过程之前完成

当您的应用程序托管在IIS下时,我们让IIS负责身份验证,所以这就是它工作的原因。在
launchSettings.json
中,您可能有如下内容:

{
    .
    .
    "iisSettings": {
        "windowsAuthentication": true,
        "anonymousAuthentication": false,
        .
        .
    }
    .
    .
}

配置似乎正常工作的IIS身份验证模块。你能详细说明一下为什么需要这样做吗。也许更有趣的是,为什么只在
Configure()
中需要它,而在
ConfigureServices()
中不需要它?@JakobBuskSørensen我添加了一个简短的解释,请检查一下,让我知道它是否精疲力尽。现在它起作用了,我明白了原因:-)。悬赏被SO锁定了18个小时,但如果可能的话,我会同意的。谢谢!
{
    .
    .
    "iisSettings": {
        "windowsAuthentication": true,
        "anonymousAuthentication": false,
        .
        .
    }
    .
    .
}