首页 文章

在ASP.NET Core应用程序中启用Windows身份验证和匿名身份验证

提问于
浏览
10

我知道之前已经多次询问过这个问题,但遗憾的是,不是关于ASP.NET核心网络应用程序,而是经典的ASP.NET网络应用程序 . 我在互联网上找到的所有答案都没有帮助我,因为ASP.NET核心应用程序的IIS配置与传统的ASP.NET有很大不同 . 例如,ASP.NET Core使用Kestrel代理,因此ASP.NET中的许多配置都不在ASP.NET Core中 . 我基本上已经尝试过我可能在互联网上找到的所有内容,但没有人帮助过我 . 我想它就像在IIS中的应用程序上启用匿名和Windows身份验证一样简单,就是这样,但我想它会比这更有用 .

在单个asp.net核心Web应用程序中启用这些身份验证的过程是什么?

2 回答

  • 4

    IIS将充当反向代理,并将负责设置和向Kestrel传输用户的Windows身份 . 首先,设置IIS以允许Windows和匿名身份验证:

    enter image description here

    然后,您需要更改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令牌......)的情况 .

  • 13

    我对ASP.NET Core 2.0应用程序有类似的情况(除了单个控制器之外在整个应用程序中使用Windows身份验证),Daboul的解释还不够 .

    我必须设置自anonymous takes precedence以来here所示的自定义中间件 .

    中间件

    public class NtlmAndAnonymousSetupMiddleware
    {
        private readonly RequestDelegate next;
    
        public NtlmAndAnonymousSetupMiddleware(RequestDelegate next)
        {
            this.next = next;
        }
    
        public async Task Invoke(HttpContext context)
        {
            if (context.User.Identity.IsAuthenticated || context.Request.Path.ToString().StartsWith("/Anonymous"))
            {
                await next(context);
                return;
            }
    
            await context.ChallengeAsync("Windows");
        }
    
    }
    

    及其在Startup.cs中的用法:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();
    
        // other code here
    }
    

    因此,中间件仅接受对匿名控件的匿名请求,如果未提供Windows身份验证信息,则会提供质询 .

    匿名控制器

    由于中间件在匿名和需要身份验证之间进行区分,因此它看起来就像任何普通的控制器:

    [Route("Anonymous")]
    public class AnonymousController : Controller
    {
        [HttpGet("Echo")]
        public string Echo(string data)
        {
            return data;
        }
    }
    

    测试##

    (全部在Windows机器上完成)

    • Chrome访问非匿名控制器操作=>正常工作( @User.Identity.Name@Context.User.Identity.Name 返回正确的用户

    • Chrome匿名操作=>直接投放

    • Firefox(不直接从OS转移NTLM票证)非匿名=>模态请求user / pass =>如果提供正确,它工作正常

    • Firefox匿名操作=>直接工作

相关问题