C# HttpClient 401在第1、3、5次请求时未经授权,但在第2、4、6次调用ASP.NET 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.

在使用httpclient(控制台程序)调用web api时,我面临一个问题

  • 请求在1、3、5等时失败(401,未通过) 请求
  • 请求在第二、第四、第六等请求中成功
Program.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());
}
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
解密和验证令牌的