C# 在非管理员帐户下运行自托管OWIN Web API

C# 在非管理员帐户下运行自托管OWIN Web API,c#,.net,asp.net-web-api,owin,C#,.net,Asp.net Web Api,Owin,自托管OWIN Web API是否可以在非管理员帐户下运行?我已经尝试了几十个url预订,但都没有效果。服务无法以“访问被拒绝”开始。当帐户被添加到管理员角色时,它会工作,但我不希望这样。下面的代码在Win7 framework 4.5.2上运行 //install-package microsoft.owin.hosting //install-package Microsoft.Owin.Host.HttpListener StartOptions options = new StartO

自托管OWIN Web API是否可以在非管理员帐户下运行?我已经尝试了几十个url预订,但都没有效果。服务无法以“访问被拒绝”开始。当帐户被添加到管理员角色时,它会工作,但我不希望这样。下面的代码在Win7 framework 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.");
}
您的服务正在本地系统(系统)帐户下运行(很可能)。此帐户不在Everyone安全主体中

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


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

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

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


解决方案是以管理员身份运行visual studio。

在admin下运行此命令行

netsh http add urlacl url=http://*:8080/user=MyUser


谢谢我更新了问题,以注意需要Windows帐户。如果TFS中发生拒绝访问的情况,我启用了持续集成,但因此失败了?在进行上述更改的本地主机上,它运行良好,但我不知道如何使其在上运行tfs@JGEstevez:我不知道TFS在哪个帐户下运行该服务。你能查一下吗?“一定是同一个问题,只是一个查明账目的问题。”@MarcelN。在线TFS是否在VisualStudioTeamServices上,是否可能是签入代码的开发人员的帐户?这是TFS日志程序集初始化方法API.Tests.Integration.Initialize.SetUp引发的异常上的错误。System.Reflection.TargetInvocationException:System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Net.HttpListenerException:访问被拒绝。中止测试执行。答案中最重要的部分是问题的编辑部分,即更改URL ACL。你为什么不把那部分也写在你的答案里呢。我会把经过编辑的答案投上一票,因为这确实是这个问题中的有趣信息&在我的案例中,只有当我注册了与我在
url代码中的url完全相同的url时,它才会起作用=http://localhost:1981/
就我而言,我添加运行netsh http add urlacl url=http://+:8088/user=MyUser并向Start方法提供以下参数:WebApp.Start(“http://+:8088/”)在我的例子中,上面解决方案中的关键信息是“如果有url保留,它将阻止owin主机以拒绝访问错误启动。”我为以前的测试创建了URL保留(不使用OWIN),因此我试图“修复”保留只会造成个人混淆;删除预订。感谢viggity和ColinLocalhost似乎是一个特例。即使添加了“http://+:8088”,也必须向localhost添加“授予特定权限”。如果选项设置中有“”,则还必须添加“”。我的服务在“本地服务”帐户下运行良好。当我切换到“网络服务”时,我开始被拒绝访问。尝试了许多不同的netsh-http-add-urlacl选项,带有“+”符号,但没有任何效果。只有当我从“+”切换到“”时,比如:netsh http add urlacl url=http://:80/tms user=“NT AUTHORITY\Network Service”,它才最终起作用!有人知道在这种情况下“*”和“+”之间的区别吗?这不是一个解决方案,而是一种变通方法。如果这是一个winforms应用程序,那么该应用程序需要一直在admin中运行。控制台应用程序也是如此,即使服务是在特定帐户下运行的,服务也是如此。您可以让api在另一台以管理员身份运行的计算机/程序实例上运行。但是如果你想让它们混合在一起,那么需要另一个解决方案。最初的问题是如何以非管理员的身份运行它,所以“只是以管理员的身份运行”不是答案。
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.