将FedAuth cookies从WebApi控制器传递给RestSharp
我们有一个thinktecture支持的身份服务器,用于SSO。有几种服务利用该身份服务器。我的应用程序使用ASP.net WebApi控制器来处理UI请求。对于特定的请求,我必须对上述服务之一进行RESTAPI调用。当然,该服务需要身份验证。我试图做的是将当前请求中的FedAuth Cookie传递给RestSharp客户端:将FedAuth cookies从WebApi控制器传递给RestSharp,cookies,asp.net-web-api,single-sign-on,restsharp,ws-federation,Cookies,Asp.net Web Api,Single Sign On,Restsharp,Ws Federation,我们有一个thinktecture支持的身份服务器,用于SSO。有几种服务利用该身份服务器。我的应用程序使用ASP.net WebApi控制器来处理UI请求。对于特定的请求,我必须对上述服务之一进行RESTAPI调用。当然,该服务需要身份验证。我试图做的是将当前请求中的FedAuth Cookie传递给RestSharp客户端: [HttpGet] [Route("api/testroute")] public IHttpActionResult Test() {
[HttpGet]
[Route("api/testroute")]
public IHttpActionResult Test()
{
var client = new RestSharp.RestClient(_someBaseUrl);
var req = new RestSharp.RestRequest(_someUrl);
var cookies = Request
.Headers
.GetCookies()
.SelectMany(x => x.Cookies)
.Where(x => x.Name.StartsWith("FedAuth"))
.ToList();
foreach (var cookie in cookies)
{
req.AddCookie(cookie.Name, cookie.Value);
}
var resp = client.Execute(req);
return Ok(resp);
}
RestSharp客户端调用失败,错误代码为500,内部有以下stacktrace:
[FormatException: Invalid length for a Base-64 char array or string.]
System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength) +14390795
System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength) +162
System.Convert.FromBase64String(String s) +56
System.IdentityModel.Services.ChunkedCookieHandler.ReadInternal(String name, HttpCookieCollection requestCookies) +424
System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +99
System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +173
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165
我的用户授权方法正确吗?如果是这样的话,我是不是对cookie做了什么错事(从stacktrace上看,它们好像被破坏了)?我认为您的
FedAuth
cookie是被编码的。也许您可以检查FedAuth cookie是否包含类似于'%'
的字符。如果是,只需在使用前对FedAuth进行解码即可