我知道之前已经多次询问过这个问题,但遗憾的是,不是关于ASP.NET核心网络应用程序,而是经典的ASP.NET网络应用程序 . 我在互联网上找到的所有答案都没有帮助我,因为ASP.NET核心应用程序的IIS配置与传统的ASP.NET有很大不同 . 例如,ASP.NET Core使用Kestrel代理,因此ASP.NET中的许多配置都不在ASP.NET Core中 . 我基本上已经尝试过我可能在互联网上找到的所有内容,但没有人帮助过我 . 我想它就像在IIS中的应用程序上启用匿名和Windows身份验证一样简单,就是这样,但我想它会比这更有用 .
在单个asp.net核心Web应用程序中启用这些身份验证的过程是什么?
2 回答
IIS将充当反向代理,并将负责设置和向Kestrel传输用户的Windows身份 . 首先,设置IIS以允许Windows和匿名身份验证:
然后,您需要更改web.config以要求IIS将Windows身份(如果找到一个)发送到您的ASP.NET Core应用程序,如下所示:https://stackoverflow.com/a/42163175/6827240
此时,如果使用"[Authorize]"属性创建控制器操作,
HttpContext.User.Identity.Name;
应具有客户端使用的Windows标识的值 . 我回复了类似的东西:NTLM authentication on specific route in ASP.NET Core好处是,如果您的客户端未传递Windows身份令牌,则标准控制器操作仍然有效,而受保护的(使用[Authorize]标记)将失败 .
PS:我喜欢在详细模式下使用curl.exe来查看授权协议(协商协议,NTLM令牌......)的情况 .
我对ASP.NET Core 2.0应用程序有类似的情况(除了单个控制器之外在整个应用程序中使用Windows身份验证),Daboul的解释还不够 .
我必须设置自anonymous takes precedence以来here所示的自定义中间件 .
中间件
及其在Startup.cs中的用法:
因此,中间件仅接受对匿名控件的匿名请求,如果未提供Windows身份验证信息,则会提供质询 .
匿名控制器
由于中间件在匿名和需要身份验证之间进行区分,因此它看起来就像任何普通的控制器:
测试##
(全部在Windows机器上完成)
Chrome访问非匿名控制器操作=>正常工作(
@User.Identity.Name
和@Context.User.Identity.Name
返回正确的用户Chrome匿名操作=>直接投放
Firefox(不直接从OS转移NTLM票证)非匿名=>模态请求user / pass =>如果提供正确,它工作正常
Firefox匿名操作=>直接工作