C# HttpClient 401在第1、3、5次请求时未经授权,但在第2、4、6次调用ASP.NET Web API时成功
在使用httpclient(控制台程序)调用web api时,我面临一个问题C# HttpClient 401在第1、3、5次请求时未经授权,但在第2、4、6次调用ASP.NET Web API时成功,c#,asp.net-web-api,oauth-2.0,owin,C#,Asp.net Web Api,Oauth 2.0,Owin,在使用httpclient(控制台程序)调用web api时,我面临一个问题 请求在1、3、5等时失败(401,未通过) 请求 请求在第二、第四、第六等请求中成功 Program.cs static void Main(string[] args) { var token = GlobalVariables.GetAccessToken(); Console.WriteLine("================================"); Console.
- 请求在1、3、5等时失败(401,未通过) 请求
- 请求在第二、第四、第六等请求中成功
static void Main(string[] args)
{
var token = GlobalVariables.GetAccessToken();
Console.WriteLine("================================");
Console.WriteLine("TOKEN");
Console.WriteLine($"Token : {token.Token}");
Console.WriteLine($"Expires : {token.ExpiresIn}");
Console.WriteLine("================================");
Console.WriteLine("1");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("2");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("3");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("4");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("5");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("6");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.Read();
}
static void CallApiEndpoint(string url, string token)
{
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(BaseUrl);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
var response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine(response.StatusCode);
}
}
}
public void Configuration(IAppBuilder app)
{
UserManagerFactory = () => new UserManager<User>();
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
AllowInsecureHttp = true
};
app.UseOAuthBearerTokens(OAuthOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
app.UseCookieAuthentication(new CookieAuthenticationOptions());
}
Startup.cs
static void Main(string[] args)
{
var token = GlobalVariables.GetAccessToken();
Console.WriteLine("================================");
Console.WriteLine("TOKEN");
Console.WriteLine($"Token : {token.Token}");
Console.WriteLine($"Expires : {token.ExpiresIn}");
Console.WriteLine("================================");
Console.WriteLine("1");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("2");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("3");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("4");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("5");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.WriteLine("6");
Console.WriteLine("================================");
CallApiEndpoint(ApiUrl, token.Token);
Console.WriteLine("================================");
Console.Read();
}
static void CallApiEndpoint(string url, string token)
{
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(BaseUrl);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
var response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine(response.StatusCode);
}
}
}
public void Configuration(IAppBuilder app)
{
UserManagerFactory = () => new UserManager<User>();
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
AllowInsecureHttp = true
};
app.UseOAuthBearerTokens(OAuthOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
app.UseCookieAuthentication(new CookieAuthenticationOptions());
}
public void配置(IAppBuilder应用程序)
{
UserManagerFactory=()=>new UserManager();
PublicClientId=“self”;
OAuthOptions=新的OAuthAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
Provider=新的ApplicationAuthProvider(PublicClientId,UserManagerFactory),
AccessTokenExpireTimeSpan=TimeSpan.FromHours(1),
AllowInsecureHttp=true
};
应用程序使用OAuthBealerTokens(OAuthOptions);
使用OAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions());
app.UseCookieAuthentication(新的CookieAuthenticationOptions());
}
响应
提前感谢,经过数周的调查,我终于发现
401未经授权
是由于基础架构级别(IIS
)上的负载平衡器造成的
所以我只是把MachineKey
放在web.config中
希望它能帮助别人。原因是什么?您是如何配置machineKey
的?@andreycha:原因是负载平衡器
不断切换端点服务器,服务器正在使用machineKey
解密和验证令牌的