dotnet run - angular - windows身份验证 - 未经过身份验证

时间:2017-08-25 08:31:31

标签: .net angular asp.net-core windows-authentication

使用以下角度运行角度时:

  

ng serve --proxy-config proxy.config.js

和.net核心:

  

dotnet run

Windows身份验证永远不会对用户进行身份验证。

但是,从Visual Studio F5运行应用程序时,用户已经过身份验证,(相同的端口和所有内容)。

proxy.config.js

const Agent = require('agentkeepalive');

module.exports = {
        '/api': {
            target: 'http://localhost:5000',
            secure: false,
            agent: new Agent({
                maxSockets: 100,
                keepAlive: true,
                maxFreeSockets: 10,
                keepAliveMsecs: 100000,
                timeout: 6000000,
                keepAliveTimeout: 90000
            }),
            onProxyRes: proxyRes => {
                let key = 'www-authenticate';
                proxyRes.headers[key] = proxyRes.headers[key] &&
                    proxyRes.headers[key].split(',');
            }
        }
};

iisSettings

iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000/",
      "sslPort": 0
    }
  }

Startup.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(IISDefaults.AuthenticationScheme);

            services.AddMvc(config =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            });

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Use(async (context, next) =>
            {
                await next();
                if (context.Response.StatusCode == 404 &&
                    !Path.HasExtension(context.Request.Path.Value) &&
                    !context.Request.Path.Value.StartsWith("/api/"))
                {
                    context.Request.Path = "/index.html";
                    await next();
                }
            });

            app.UseMvcWithDefaultRoute();

            app.UseDefaultFiles();

            app.UseStaticFiles();
        }
    }

为什么dotnet run和dotnet watch run不能用于Windows身份验证但是Visual Studio F5呢?

更新

我尝试添加" weblistener"而不是在项目属性中启用身份验证。添加weblistener之后,我能够使用dotnet运行进行身份验证,但由于某些原因我无法再使用VS F5进行调试...

.UseHttpSys(options =>
            {
                options.Authentication.Schemes = AuthenticationSchemes.NTLM;
                options.Authentication.AllowAnonymous = false;
            })

3 个答案:

答案 0 :(得分:0)

如果很快:dotnet run启动应用程序而不使用IIS作为反向代理,因此忽略所有IIS设置

只有从Visual Studio运行应用时,才会使用launchSettings.json部分iisSettings

  

此json文件包含与每个调试配置文件关联的项目特定设置,Visual Studio配置为用于启动应用程序,包括应使用的任何环境变量。

执行dotnet run命令the Web Server (Kestrel by default) starts and hosts the app时。

从VS启动应用程序时,IIS Express实例也配置为应用程序的反向代理。这是启用Windows身份验证。

查看IIS Publishing以获取有关如何配置IIS + ASP.NET核心应用程序的详细信息。

答案 1 :(得分:0)

如果您不使用HTTPSYSWeblistener,(weblistener在2.0中用httpsys替换?),则dotnet cli不支持Windows身份验证。

没有Windows,没有Windows身份验证。

如果您在IIS中发布应用程序(不使用httpsys或weblistener),我不确定您应该如何在本地开发(在IIS中不受支持)。

我目前正在使用IIS Express,这很痛苦。

Source

答案 2 :(得分:0)

我发现David Fowler对类似问题做出了回应。 网址:https://github.com/aspnet/HttpSysServer/issues/425

有了这些更改,我既可以在Visual Studio中运行,也可以从dotnet run命令中运行。