作为非管理员用户 运行 OWIN 自托管应用程序需要什么权限?

What permissions to I need to run a OWIN self-hosted app as non-admin user?

需要什么权限才能允许用户启动侦听非本地主机 IP 的 OWIN 自托管 Web 服务?

我正在尝试 运行 命令行 app/windows 服务中的自托管网络服务。

我一直在尝试很多事情。

在计算机 mydomainname 和 IP 地址 192.168.0.153 上使用应用 运行ning:

  1. 我构建应用程序,以便 WebApp.Start() 使用 url "http://localhost:9980/":

    进行初始化
    • 我可以运行普通用户的应用。
    • 如果同一台机器上的客户端对“http://localhost:9980/...”进行调用,则一切正常。
    • 如果同一台机器上的客户端对“http://127.0.0.1:9980/...”进行调用,我将收到 HTTP 400 - 主机名无效。
    • 不在同一台机器上的客户端无法访问 Web 服务,这是正常现象。
  2. 我构建应用程序,以便 WebApp.Start() 使用 url "http://+:9980/":

    进行初始化
    • 如果我 运行 作为普通用户的应用程序,我会得到一个 "Access is denied" 异常。
    • 如果我 运行 应用程序作为管理员用户,一切正常。
    • 如果同一台机器上的客户端对“http://localhost:9980/...”进行调用,则一切正常。
    • 如果同一台机器上的客户端对“http://127.0.0.1:9980/...”进行调用,则一切正常。
    • 如果同一台机器上的客户端对“http://mydomainname:9980/...”进行调用,则一切正常。
    • 如果我没有在端口 9980 上启用入站规则,不在同一台机器上的客户端当然会超时。
    • 如果我在端口 9980 上启用了入站规则,则不在同一台机器上的客户端可以正常工作,使用我的域名或 IP 地址 192.168.0.153。

但事情是这样的——我不能把它交给操作人员,要求它 运行 作为管理员。

  1. 所以我尝试构建应用程序,以便 WebApp.Start() 使用多个 url 进行初始化:“http://localhost:9980/”、“http://127.0.0.1:9980/” , “http://mydomainname:9980/”。 (注意 - 不包括 192.168.0.153)。

    • 当我 运行 作为非管理员时,我再次得到 "Access is denied" 异常。
    • 当我 运行 作为管理员时,它有效。
    • 使用本地主机的本地客户端。 127.0.0.1 和 mydomainname 工作,使用机器 IP 地址的本地客户端不工作。
    • 使用 mydomainname 的远程客户端工作,使用 192.168.0.153 的远程客户端不工作。
  2. 所以我尝试构建应用程序,以便 WebApp.Start() 使用多个本地主机 url 进行初始化:“http://localhost:9980/”,“http://127.0.0.1:9980/ ”。

    • 当我 运行 作为非管理员时一切正常。
  3. 所以我尝试构建应用程序,以便 WebApp.Start() 使用“http://192.1680.153:9980/”进行初始化。 (服务器机器的 IP 地址)。

    • 当我 运行 作为非管理员时,我再次得到 "Access is denied" 异常。

我一直在四处浏览以寻求建议,对于所有这些,我看到过一些帖子说我需要使用 netsh 来配置 urlacl,还有一些帖子说我无法配置任何 urlacls,而且我从任何人那里看到的任何内容都表明任何人对它的工作原理或应该工作有任何明确的答案。

我似乎很清楚,用户必须拥有一些特定权限才能启动 OWIN,以便它侦听非本地主机 IP。那个管理员有它,而我的正常登录没有。

有谁知道这个权限是什么,以及如何将它授予普通登录用户?

我无法将需要管理员权限的应用交付给 运行。

不过,我可以提供一个应用程序,当用户 运行 没有配置某些特定权限时,它会以 "HEY! You need to grant the user permission XXX".

退出

但是需要什么权限才能允许用户启动侦听非本地主机 IP 的 OWIN 自托管 Web 服务?

L.B 的评论包含正确答案 - 我需要授予用户打开该特定端口的权限。

我修改了应用程序以识别该特定错误。当它捕捉到一个 TargetInvocationException 和一个 InnerException 是一个 HttpListenerException,并且它有一个 ErrorCode == 5,我显示一条错误消息,准确地告诉用户需要做什么:

Starting WebApp on port: 9980

ERROR User does not have permission to start webservice on port 9980.

To grant a user permission to start a webservice on this machine, run in an administrative console (once):

netsh http add urlacl url=http://+:9980/ user=<username>

或:

netsh http add urlacl url=http://+:9980/ user=EVERYONE