Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 当Api返回Http状态代码401时,.Net核心客户端不重定向登录页_Asp.net Core_Jwt Auth - Fatal编程技术网

Asp.net core 当Api返回Http状态代码401时,.Net核心客户端不重定向登录页

Asp.net core 当Api返回Http状态代码401时,.Net核心客户端不重定向登录页,asp.net-core,jwt-auth,Asp.net Core,Jwt Auth,我有一个API和一个MVC客户端。当API返回HTTP代码401时,我想重定向客户端MVC的登录页面。我使用刷新令牌 客户端MVC应用程序中的Startup.cs: public void配置服务(IServiceCollection服务){ services.AddControllersWithViews(); AddHttpContextAccessor(); services.AddTransient(); services.AddHttpClient(“APIClient”,client

我有一个API和一个MVC客户端。当API返回HTTP代码401时,我想重定向客户端MVC的登录页面。我使用刷新令牌

客户端MVC应用程序中的Startup.cs:

public void配置服务(IServiceCollection服务){
services.AddControllersWithViews();
AddHttpContextAccessor();
services.AddTransient();
services.AddHttpClient(“APIClient”,client=>{
client.BaseAddress=新Uri(“https://localhost:44358/");
client.DefaultRequestHeaders.Clear();
Add(HeaderNames.Accept,“application/json”);
}).AddHttpMessageHandler();
services.AddHttpClient(“IdentityClient”,客户端=>{
client.BaseAddress=新Uri(“https://localhost:44358/");
client.DefaultRequestHeaders.Clear();
Add(HeaderNames.Accept,“application/json”);
});
services.AddAuthentication(x=>{
x、 DefaultAuthenticateScheme=CookieAuthenticationDefaults.AuthenticationScheme;
x、 DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,选项=>{
options.AccessDeniedPath=“/Authorization/AccessDenied”;
options.LoginPath=“/Login/UserLogin”;
options.Events.OnRedirectToLogin=上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.Unauthorized;
返回Task.CompletedTask;
};
});
}
//此方法由运行时调用。使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境){
if(env.IsDevelopment()){
app.UseDeveloperExceptionPage();
}
否则{
app.UseExceptionHandler(“/Home/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(端点=>{
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller=Home}/{action=Index}/{id?}”);
});
}
客户端中的BearerTokenHandler.cs:

public类BearerTokenHandler:DelegatingHandler{
专用只读IHttpContextAccessor\u httpContextAccessor;
私有只读IHttpClientFactory\U httpClientFactory;
公共承载器TokenHandler(IHttpContextAccessor httpContextAccessor,
IHttpClientFactory(httpClientFactory){
_httpContextAccessor=httpContextAccessor??
抛出新ArgumentNullException(nameof(httpContextAccessor));
_httpClientFactory=httpClientFactory??
抛出新ArgumentNullException(nameof(httpClientFactory));
}
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken){
var accessToken=wait GetAccessTokenAsync();
如果(!string.IsNullOrWhiteSpace(accessToken)){
request.Headers.Authorization=新的AuthenticationHeaderValue(“承载者”,accessToken);
}
返回wait base.sendaync(请求、取消令牌);
}
公共异步任务GetAccessTokenAsync(){
var authenticationInfo=await_httpContextAccessor.HttpContext.authenticateSync();
//获取expires\u at值并解析它
var expiresAt=authenticationInfo.Properties.GetTokenValue(“Expires”);
var expiresAtAsDateTimeOffset=
Parse(expiresAt,CultureInfo.InvariantCulture);
if((expiresAtAsDateTimeOffset.AddSeconds(-60)).ToUniversalTime()>DateTime.UtcNow){
//无需刷新,返回访问令牌
返回authenticationInfo.Properties.GetTokenValue(OpenIdConnectParameterNames.AccessToken);
}
var idpClient=_httpClientFactory.CreateClient(“IdentityClient”);
//刷新令牌
var refreshttoken=authenticationInfo.Properties.GetTokenValue(OpenIdConnectParameterNames.RefreshtToken);
var refreshttokenrequest=newhttprequestmessage(HttpMethod.Post,$“/accounts/refreshtoken”);
refreshTokenRequest.Content=新建StringContent(
序列化(新的RefreshTokenRequest{RefreshToken=RefreshToken}),
编码。Unicode,
“应用程序/json”);
var refreshttokenresponse=await idpClient.sendsync(refreshttokenrequest.ConfigureAwait(false);
refreshTokenResponse.EnsureAccessStatusCode();
var refreshResponse=JsonSerializer.Deserialize(等待refreshTokenResponse.Content.ReadAsStringAsync(),新的JsonSerializerOptions{
PropertyNamingPolicy=JsonNamingPolicy.CamelCase,
});
authenticationInfo.Properties.UpdateTokenValue(OpenIdConnectParameterNames.IdToken,refreshResponse.Id.ToString());
authenticationInfo.Properties.UpdateTokenValue(OpenIdConnectParameterNames.AccessToken,refreshResponse.JwtToken);
authenticationInfo.Properties.UpdateTokenValue(OpenIdConnectParameterNames.RefreshToken、refreshResponse.RefreshToken);
authenticationInfo.Properties.UpdateTokenValue(“Expires”,(DateTime.UtcNow+TimeSpan.FromSeconds)(refreshResponse.Expi