使用OWIN SelfHost和Windows身份验证的WebApi

11

我有一个控制台应用程序SERVER,它使用OWIN自托管来托管WebApi控制器,并在名为"ServiceTest1"的自定义帐户下运行。

在同一台机器上,我有另一个控制台应用程序CLIENT,它在帐户"ServiceTest2"下运行,我想在SERVER中捕获"ServiceTest2"调用的控制器操作。但是:

  • WindowsIdentity.GetCurrent()始终是"ServiceTest1"。
  • Thread.CurrentPrincipal是未经身份验证的GenericIdentity
  • RequestContext.Principal为null。
  • User为null。

我需要什么来使这个WebApi OWIN自托管可以抓取调用者的Windows身份?

1个回答

27

你的问题不太清楚你如何实现Windows身份验证。

启用Windows身份验证:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
        listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

        // ...
    }
}

在 OWIN 中间件中获取用户:

public async Task Invoke(IDictionary<string, object> env)
{
    OwinContext context = new OwinContext(env);
    WindowsPrincipal user = context.Request.User as WindowsPrincipal;

    //...
}

在Web API Controller中获取用户:

// In a web api controller function
WindowsPrincipal user = RequestContext.Principal as WindowsPrincipal;

那个 env 参数是什么?我有普通的 WebApi 控制器,继承自 ApiController - vtortola
啊,我曾经误解了你的问题,认为你想要一种 OWIN 方法来获取身份。我已经编辑了我的回答,加入了一个 Web API 版本。 - Zephyr
RequestContext.Principal 为空,有任何想法为什么? - vtortola
它正在使用Windows身份验证运行,对吧?当您从ServiceTest2访问API时,必须使用Windows凭据登录?除此之外,我不确定。我的服务器在Owin自托管上运行,使用Windows Auth似乎能够访问请求主体。 - Zephyr
这就是问题所在,如何在使用OWIN自托管的WebAPI中设置Windows身份验证。你是如何配置Windows身份验证的? - vtortola
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接