.Net Core 2.0中的Windows和匿名身份验证

Ted*_*siu 13 .net c# asp.net authentication asp.net-core

我正在尝试在.Net Core 2.0空Web应用程序中混合使用Windows匿名身份验证.我想避免[Authorize]属性,因为我不想使用Mvc或控制器.

我的设置如下:

  1. 我创建了一个空的.Net Core 2.0 Web应用程序

  2. 我去项目属性 - >调试 - >选中"启用Windows身份验证"并禁用"启用匿名身份验证".现在"windowsAuthentication":true和"anonymousAuthentication":false出现在我的"IIS"下的launchSettings.json中.

  3. 在Startup.cs内部,在ConfigureServices中,我services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme);按照https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x#windows-authentication-httpsys--iisintegration中的说明添加 了

  4. 我添加了一个简单的内容Console.WriteLine(context.User.Identity.Name);,它可以在app.Run中运行,并且......一切正常!

但是......一旦我在launchSettings.json中将"anonymousAuthentication"设置为true,它就会停止工作,我无法弄清楚我可以做些什么来使Windows身份验证与它一起工作.Context.User.Identity.IsAuthenticated总是假的.正如您所看到的,我的配置非常简单,我需要它保持这种状态.我想在某些动态路由上启用/禁用Windows身份验证,因此使用具有[Authorize]属性的控制器不是一个选项.

我想要实现的是一个简单的应用程序,其中网址"/ authenticated"将回复值,context.User.Identity.Name而网址"/ public"将回复说"这是一个公共页面!".类似于ASP.NET Core中特定路由上的NTLM身份验证,但没有[Authorize]属性和控制器.资源非常稀缺......任何人都知道我可能会缺少什么?谢谢!

Tra*_*her 11

匿名优先.当您收到对应用程序的受限制部分的匿名请求时,您需要调用httpContext.ChallengeAsync().这将导致客户端在下一个请求上发送凭据.这是一个测试,这样做.

  • 非常感谢!`context.ChallengeAsync("Windows")` 成功了!我发誓我尝试了等待 `context.ChallengeAsync()`,但我使用“NTLM”作为模式参数,它告诉我身份验证模式不存在...不知道要传递什么值... (3认同)

Ale*_*xei 8

在这个话题上浪费了一些时间后,Tratcher 的回答拯救了我。对于一个非常简单的场景(匿名控制器 + Windows 身份验证限制在其余部分),这里是一个快速入门(中间件):

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");
    }

}
Run Code Online (Sandbox Code Playgroud)

我刚刚在Startup.Configure方法的开头插入了这个:

app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();
Run Code Online (Sandbox Code Playgroud)