#c# #asp.net-identity #asp.net-core-webapi
#c# #asp.net-identity #asp.net-core-webapi
Вопрос:
Я пытаюсь вызвать API с HttpClient
помощью, и когда я вызываю API без [Authorize]
, я получаю всю информацию правильно. когда я добавляю атрибут, я получаю несанкционированную ошибку 401. Самое смешное, что он работает правильно, когда я вызываю токен на предъявителя из Postman.
Я видел несколько сообщений, в которых говорится, что нужно добавить app.UseAuthentication();
, прежде app.UseAuthorization();
чем я это сделал.
Ниже приведен код, который я использую для вызова API. Я заметил, что я звоню http://localhost:5000/api/accounts
, но получаю ответ от https://localhost:5001/api/accounts
protected HttpClient CreateClient()
{
var client = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["ServerAddress"]) };
if(_securityService.HasToken)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _securityService.Token);
}
return client;
}
protected async Task<T> GetAsync<T>(string url, CancellationToken cancellationToken = default, params object[] parameters)
{
using var client = CreateClient();
if (parameters.Any())
url = string.Format(url, parameters);
var response = await client.GetAsync(url, cancellationToken);
if (response.IsSuccessStatusCode)
{
var stringContent = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(stringContent);
}
else
{
//TODO: Add Logger and log Result
return default;
}
}
Ответное сообщение
У меня здесь 2 вопроса, почему это изменило uri запроса, может кто-нибудь, пожалуйста, объяснить, почему это будет работать в postman, но не с использованием HttpClient.
Я подумал об этом и подумал, что мне тоже следует добавить сюда код сервера.
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<SchedulerContext>()
.AddDefaultTokenProviders();
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
var securityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Constants.ConstantsToAddToSecrets.Seceret));
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = securityKey,
ValidateIssuer = false,
ValidateAudience = false
};
});
services.AddAuthorization(options =>
{
options.DefaultPolicy =
new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
options.AddPolicy(Roles.Manager, policy => policy.RequireClaim(Roles.Manager));
options.AddPolicy(Roles.User, policy => policy.RequireClaim(Roles.User));
options.AddPolicy(Roles.Admin, policy => policy.RequireClaim(Roles.Admin));
options.InvokeHandlersAfterFailure = true;
});
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.User.RequireUniqueEmail = false;
options.Tokens.AuthenticatorIssuer = ConstantsToAddToSecrets.Issuer;
});
Комментарии:
1. Есть ли у вас
app.UseHttpsRedirection();
свойConfigure
метод? Это может быть причиной перенаправления2. ДА. У меня это есть. в этом и заключалась проблема.
3. Используете ли вы один и тот же токен для Postman и клиента?
4. да, это тот же токен.