具有 OWIN 自主机和 Windows 身份验证的 Web Api

Posted

技术标签:

【中文标题】具有 OWIN 自主机和 Windows 身份验证的 Web Api【英文标题】:WebApi with OWIN SelfHost and Windows Authentication 【发布时间】:2015-11-11 21:05:47 【问题描述】:

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

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

WindowsIdentity.GetCurrent() 始终是“ServiceTest1”。 Thread.CurrentPrincipal 是未经身份验证的 GenericIdentityRequestContext.Principal 为空。 User 为空。

我需要做什么才能让这个 WebApi OWIN 自托管以获取调用者的 Windows 身份?

【问题讨论】:

【参考方案1】:

您的问题有点不清楚您是如何实现 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 控制器中获取用户:

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

【讨论】:

env 参数是什么?我有从 ApiController 继承的普通 WebApi 控制器。 啊,我读过你的问题是想要一种 OWIN 方法来获取身份。我还使用 Web API 版本编辑了我的回复。 RequestContext.Principal 为空,知道为什么吗? 它是通过 Windows 身份验证运行的吗?当您从 ServiceTest2 访问 api 时,它必须使用 Windows 凭据登录?除此之外,我不确定。我的服务器在使用 Windows Auth 的 Owin 自主机上运行似乎能够访问请求主体。 这就是问题所在,如何在使用 OWIN 自托管的 WebAPI 中设置 Windows 身份验证。您是如何配置 Windows 身份验证的?

以上是关于具有 OWIN 自主机和 Windows 身份验证的 Web Api的主要内容,如果未能解决你的问题,请参考以下文章

Owin 和 Windows 身份验证 (mvc5) - 使用 Windows 身份验证作为登录的一部分

具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN

具有多个 OIDC 身份验证配置的 OWIN

如何在 Web API 的 Owin 身份验证的 Provider 类中获取 Windows 登录?

使用 MVC5 和 OWIN 的自定义身份

使用 Microsoft.Owin.Testing.TestServer 进行内存集成测试的身份验证