При входе в вк, пишет ошибка авторизации null? что делать? – форум программы zona для windows
❶ как исправить ошибку авторизации
В процессе установки нового программного обеспечения пользователи иногда сталкиваются с такой проблемой как «ошибка авторизации». Такая же ошибка возникает и после регистрации в различных социальных сетях, на сайтах информационного и игрового характера.
Инструкция
C# – сбой проверки jwt в asp.net core 2.0: `ошибка авторизации для пользователя: (null)` –
Я использую приложение ASP.NET Core 2.0 (Web API) в качестве издателя JWT для генерации токена, потребляемого мобильным приложением. К сожалению, этот токен не может быть проверен одним контроллером, в то время как может быть проверен другим (используя тот же параметр проверки в том же приложении asp.net core 2.0).
Таким образом, у меня есть токен, который действителен и может быть декодирован, имеет все необходимые утверждения и временные метки. Но одна конечная точка принимает это, а другая выдает ошибку 401 и выводит отладочные данные:
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация не выполнена для пользователя: (пусто).
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed for user: (null).
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: (null).
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[12]
AuthenticationScheme: Bearer was challenged.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: AuthenticationScheme: Bearer was challenged.
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 271.077ms 401
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 271.077ms 401
Моя настройка проверки ниже:
var secretKey = Configuration["Authentication:OAuth:IssuerSigningKey"];
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateIssuer = true,
ValidIssuer = Configuration["Authentication:OAuth:Issuer"],
ValidateAudience = true,
ValidAudience = Configuration["Authentication:OAuth:Audience"],
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = tokenValidationParameters;
});
Эти две конечные точки идентичны, просто живут в разных контроллерах, оба помечены атрибутом Authorize
.
Как это возможно?
Лучший ответ
В вашем файле startup.cs ConfigureServices, если вы добавите
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => ...
< EM> Объяснение : Когда вы используете [Authorize] на контроллере, он связывается с первой системой авторизации по умолчанию.
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
При этом вы устанавливаете по умолчанию аутентификацию JWT Bearer.
Дополнительно вы можете добавить
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
Эта строка объясняет, как предотвратить появление 404 не найденных ошибок при использовании Identity с JWT. Если вы используете идентичность, DefaultChallengeScheme попытается перенаправить вас на страницу входа, что в случае несуществования приведет к получению 404 не найденным, а не желаемым 401 неавторизованным. установив DefaultChallengeScheme в JwtBearerDefaults.AuthenticationScheme для неавторизованного, он больше не будет пытаться перенаправить вас на страницу входа
Если вы используете проверку подлинности с использованием JWT в теге [Authorize] , вы можете указать, какую схему аутентификации вы хотите. например
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
Когда аутентификации добавляются как:
services.AddAuthentication(options => {
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
....
Это означает, что каждый атрибут [Authorize], который помещается поверх метода или класса контроллера, будет пытаться пройти аутентификацию по схеме аутентификации по умолчанию (в данном случае JwtBearer) , И ЭТО НЕ СКАСДАЕТСЯ ВНИЗ попытаться аутентифицироваться с другими схемами, которые могут быть объявлены (например, схема Cookie). Чтобы аутентифицировать AuthorizeAttribute по схеме cookie, его нужно указать следующим образом:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
Это будет работать и наоборот, т. Е. Если схема cookie используется по умолчанию, тогда схема JwtBearer должна быть объявлена для авторизации для тех методов или контроллеров, которым потребуется аутентификация токена JwtBearer.
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]