【问题标题】:Running self-hosted OWIN Web API under non-admin account在非管理员帐户下运行自托管 OWIN Web API
【发布时间】:2014-09-18 12:42:55
【问题描述】:

自托管的 OWIN Web API 是否可以在非管理员帐户下运行?我已经尝试了几十个 url 预订,但没有任何效果。该服务无法以“访问被拒绝”启动。当帐户添加到管理员角色时它可以工作,但我不希望这样。下面的代码在 Win 7 框架 4.5.2 上运行。

//install-package microsoft.owin.hosting
//install-package Microsoft.Owin.Host.HttpListener

StartOptions options = new StartOptions();
options.Urls.Add("http://localhost:5000/");
//options.Urls.Add(string.Format("http://{0}:5000", Environment.MachineName));
//options.Urls.Add("http://+:5000/");
//options.Urls.Add("http://*:5000/");

using (WebApp.Start<WebAPISelfHostMinimal.Startup>(options))
{
    while (!Terminate)
    {
        await Task.Delay(10); //keep cpu from getting pegged
    }

    LogUtil.LogInfo("Terminating owin host.");
}

EDIT - 这是在 Windows 帐户下运行的。

C:\>netsh http add urlacl http://+:5000/ user=mini2012\svcAPI

URL reservation successfully added

C:\>sc start apiservice
[SC] StartService FAILED 5:

Access is denied.

C:\>netsh http add urlacl http://*:5000/ user=mini2012\svcAPI

URL reservation successfully added

C:\>sc start apiservice
[SC] StartService FAILED 5:

Access is denied.

C:\>netsh http add urlacl http://localhost:5000/ user=mini2012\svcAPI

URL reservation successfully added

C:\>sc start apiservice
[SC] StartService FAILED 5:

Access is denied.

【问题讨论】:

  • 我的服务在“本地服务”帐户下运行良好。当我切换到“网络服务”时,我开始被拒绝访问。尝试了许多带有“+”号的 netsh http add urlacl 选项 - 没有任何效果。只有当我像这样从“+”切换到“”时:netsh http add urlacl url=http://:80/tms user="NT AUTHORITY\Network Service" 才终于成功了!有人知道在这种情况下“*”和“+”之间的区别吗?

标签: c# .net asp.net-web-api owin


【解决方案1】:

问题似乎出在 URL 保留上。我不需要一个。如果有 URL 保留,它只会阻止 owin 主机以拒绝访问错误启动。此外,owin 主机的默认端口是 5000。如果该端口上仍在运行“死”进程,它将阻止您的服务启动。要检查您可以在命令提示符处运行netstat -a -b

【讨论】:

  • 答案中最重要的部分在您问题的 EDIT 部分,即更改 URL ACL。你为什么不把那部分也放在你的答案中。我会赞成编辑后的答案,因为这确实是本问答中有趣的信息
  • 在我的情况下,它只有在我注册与代码中完全相同的 url 时才有效,即url=http://localhost:1981/
  • 在我的情况下,我添加运行 netsh http add urlacl url=http://+:8088/ user=MyUser 并为 Start 方法提供以下参数:WebApp.Start("http: //+:8088/")
  • 在我的例子中,来自上述解决方案的关键信息是“如果有 URL 保留,它只会阻止 owin 主机从拒绝访问错误开始。”我为之前的测试创建了 URL 保留(不使用 OWIN),所以我尝试“修复”保留只会造成个人困惑;删除预订。谢谢 Viggity 和 Colin
  • Localhost 似乎是个特例。即使您添加了“http://+:8088”,您也必须添加对 localhost 的特定权限。如果这是您在选项设置中的内容,您还必须添加“localhost:8088”。
【解决方案2】:

您的服务正在(很可能)在 LocalSystem (SYSTEM) 帐户下运行。此帐户不在所有人安全主体中。

简而言之,要解决这个问题,要么为匿名登录保留命名空间,要么将您的服务更改为在恰好位于所有人主体中的网络服务帐户下运行。

当然,第三种选择是创建一个新的本地/域用户,为其创建预留并让服务在此帐户下运行。但是你不得不担心为它设置适当的安全权限,所以我会选择前两个选项之一。

【讨论】:

  • 谢谢。我更新了问题,指出需要 Windows 帐户。
  • TFS 中发生的访问被拒绝怎么办,我启用了持续集成并因此失败?,它在 localhost 上运行良好,进行上述更改,但我不知道如何让它在 tfs 上运行
  • @JGEstevez:我不知道 TFS 在哪个帐户下运行该服务。你可以检查吗?一定是同一个问题,只是找出帐户的问题。
  • @MarcelN。是 Visual Studio Team Services 上的在线 TFS,会不会是签入代码的开发人员的帐户?这是 TFS 日志程序集初始化方法 API.Tests.Integration.Initialize.SetUp 抛出异常的错误。 System.Reflection.TargetInvocationException:System.Reflection.TargetInvocationException:调用目标已引发异常。 ---> System.Net.HttpListenerException:访问被拒绝。中止测试执行。
【解决方案3】:

在管理员下运行这个命令行

netsh http 添加 urlacl url=http://*:8080/user=MyUser

【讨论】:

    【解决方案4】:

    对于正在寻找解决方案但没有阅读文本的人。

    解决办法是以管理员身份运行visual studio。

    【讨论】:

    • 这不是解决方案,而是解决方法。如果这是一个 winforms 应用程序,那么该应用程序需要一直在管理员中运行。控制台应用程序也是如此,如果它们在特定帐户下运行,甚至服务也是如此。
    • 您可以让 api 在另一台以管理员身份运行的计算机/程序实例上运行。但是,如果您希望将它们混合在一起,则需要另一种解决方案。
    • 最初的问题是如何以非管理员身份运行它,所以“只以管理员身份运行”没有答案。
    猜你喜欢
    • 2019-01-28
    • 2019-02-24
    • 2015-01-09
    • 2021-01-22
    • 2018-06-20
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多