coo*_*ake 16 c# authorization authorize-attribute asp.net-core-2.0
我在asp.net core 2.0中创建了API,我正在使用混合模式身份验证.对于一些控制器JWT和一些使用Windows身份验证.
我对使用JWT授权的控制器没有任何问题.但对于我想要使用Windows身份验证的控制器,我无限期地提示使用chrome的用户名和密码对话框.
这里是我的示例控制器代码,我想使用Windows身份验证而不是JWT.
[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = "Windows")]
public class TestController : Controller
{
    [HttpPost("processUpload")]
    public async Task<IActionResult> ProcessUploadAsync(UploadFileModel uploadFileModel)
    {
    }
}
我的配置服务代码
public void ConfigureServices(IServiceCollection services)
{
     services.AddAuthentication(options =>
     {
        options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
     .AddJwtBearer("Bearer", options =>
     {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false,       
            ValidateIssuer = false,  
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("blahblahKey")),
            ValidateLifetime = true, //validate the expiration and not before values in the token
            ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
        };
     });
     // let only my api users to be able to call 
     services.AddAuthorization(auth =>
     {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme??)
            .RequireClaim(ClaimTypes.Name, "MyApiUser").Build());
     });
     services.AddMvc();
}
我的配置方法.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("CorsPolicy");
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseAuthentication(); //needs to be up in the pipeline, before MVC
    app.UseMvc();
}
感谢您的建议和帮助.
更新:直到现在我一直在调试我的代码在chrome上.但是当我使用IE 11时,上面的代码运行没有任何问题.
这可能是预检问题的铬的CORS问题吗?
谢谢
vas*_*sib 24
您需要确保在尝试使用Windows身份验证时不设置Authorization: Bearer <JWT_token>HTTP标头.这里的关键点是"Windows Auth"实际上是如何工作的.让我们看看它如何与浏览器一起工作.
我们称之为"正常流程":
http://example.com/api/resource浏览器;http://example.com/api/resource没有任何AuthorizationHTTP标头(匿名请求);Authorization标头并401 Not Authorized使用WWW-Authenticate: NTLM,NegotiateHTTP Header设置状态代码进行响应("离开,没有匿名访问.欢迎'NTLM'或'Negotiate'人员! ");401响应,发现该请求是匿名的,查找WWW-Authenticate标题并立即重复请求,现在使用Authorization: NTLM <NTLM_token>HTTP标头("好的,放轻松,先生.Web服务器!这是我的NTLM令牌.");Authorization标头中找到NTLM令牌,验证它并执行请求("好的,你可以通过.这是你的资源.").当你初步将Authorization标题设置为某个值时,事情会有所不同:
http://example.com/api/resourceJWT授权;http://example.com/api/resource与Authorization: Bearer <JWT_token>现在的HTTP头;Authorization"Bearer"认证方案的标题,并再次401 Not Authorized使用WWW-Authenticate: NTLM,NegotiateHTTP Header设置的状态代码进行响应("走开,我们不知道这是谁'持票人"伙计们,但我们不喜欢他们.只欢迎'NTLM'或'谈判'的家伙!");401响应,发现该请求已获得授权,并确定此令牌是错误的.但是,当你实际设置Authorization标题时,这意味着你实际上有一些凭据.因此,它会通过此对话框询问您的凭据.