servicestack,windows-authentication,C#,Rest,servicestack,Windows Authentication" /> servicestack,windows-authentication,C#,Rest,servicestack,Windows Authentication" />

使用ServiceStack和具有Windows身份验证的C#客户端进行服务调用会引发未经授权的异常

使用ServiceStack和具有Windows身份验证的C#客户端进行服务调用会引发未经授权的异常,c#,rest,servicestack,windows-authentication,C#,Rest,servicestack,Windows Authentication,我有一个公开一组REST服务的服务器。我正在WPF客户端中使用这些服务。所有这些都在内部网中工作,最近我决定打开Windows身份验证(直到现在我才使用另一种形式的身份验证),以便实现SSO。 当我启用IWA时,通过浏览器调用时,所有服务都可以访问。问题是,当我使用C#客户机(JsvServiceClient-一个ServiceStack类)调用它们时,会出现未经授权的异常。我使用协商是因为我需要Kerberos在服务器上进行模拟/委派 我自己的一些想法: 当我运行fiddler时,它似乎是隐藏

我有一个公开一组REST服务的服务器。我正在WPF客户端中使用这些服务。所有这些都在内部网中工作,最近我决定打开Windows身份验证(直到现在我才使用另一种形式的身份验证),以便实现SSO。 当我启用IWA时,通过浏览器调用时,所有服务都可以访问。问题是,当我使用C#客户机(JsvServiceClient-一个ServiceStack类)调用它们时,会出现未经授权的异常。我使用协商是因为我需要Kerberos在服务器上进行模拟/委派

我自己的一些想法:

当我运行fiddler时,它似乎是隐藏的,当浏览器发出第一个请求时,它也会收到未经授权的请求,但之后它会发送另一个带有授权的请求:在标题中协商ygMDAuBgorBgEEAYI3AgIKB(这个令牌更长,为了简单起见,我缩短了它)。这样做会再次导致未经授权。之后,发送第三个请求,该请求再次具有授权:在报头中进行协商(但之后使用不同的令牌)。这一次请求被授权并显示数据

我知道身份验证、授权、缓存等在SS中是如何工作的,但问题是在服务器上没有调用任何代码(当使用JsvServiceClient时)。我创建了一个HttpModule并将其添加到web配置中,只是为了调试。HttpApplication.AuthenticateRequest被激发,然后立即抛出Unhorized。因此,显然在这个级别拒绝了调用,并且,由于SS主要是将HttpHandlers放在一起工作,因此不会触发任何服务器代码(根本没有到达处理程序)

浏览器可能自己执行一些处理WindowsAuth(某种握手或其他)的逻辑,而SS中的C#clients不处理这些逻辑。但由于我不确定这一点,我决定询问这里所有的大师


可能这是一个愚蠢的问题,但显然我自己无法解决,因此非常感谢您的帮助。

通过向客户端添加
RequestFilter
,您可以为当前登录的用户设置凭据,就像浏览器为您设置凭据一样

有关更多信息,请参阅

JsvServiceClient=newJSVServiceClient(“https://host:port/");
...
client.RequestFilter=req=>{
请求凭证=CredentialCache.DefaultCredentials;
};
要解决您的具体问题:

浏览器可能自己执行一些处理WindowsAuth(某种握手或其他)的逻辑,而SS中的C#clients不处理这些逻辑

是的,当从Intranet区域访问时,浏览器会自行处理Windows身份验证。但是ServiceStack客户机中的底层
HttpWebRequest
JsvServiceClient
,需要进行配置,以发送如上所示的凭据

我知道身份验证、授权、缓存等在SS中是如何工作的,但问题是在服务器上没有调用任何代码

IIS提供Windows身份验证层,而不是ServiceStack,因此在Windows身份验证成功之前,不会调用ServiceStack服务中的代码。只有这样,请求才会传递给ServiceStack处理程序


希望这有帮助。

是的,这就解决了问题。显然,正如我所料,这是一个愚蠢的问题。标记作为答案。谢谢,伙计。