Я вызываю метод в моем контроллере и достигаю точки останова в его конструкторе.Проверка User.Claims.First (...) вызывает исключение, и после более тщательного изучения выясняется, что Пользователь равен null .
Это имеет смысл, поскольку контроллер не может знать, кто является анонимным пользователем, который его вызывает.Затем я добавляю заголовок Авторизация , оценивая его по Носитель xxx.yyy.zzz (Почтальон, а также мое угловое приложение).Токен правильный, потому что подделка его вызывает код состояния 401 Unauthorized .
Итак, я пришел к выводу, что настройка безопасности работает, политика ведет себя как положено (вызывается с помощьютокен, соответствующий пользователю, у которого нет прав на указанное действие, не выполняется).
Вставка текста токена в jwt.io дает ожидаемые сведения о претензиях.Следовательно, я прихожу к выводу, что токен должен быть читаемым и анализируемым для библиотек приложения.
Итак, вопрос в следующем. Как экземпляр пользователя (когда, где, на каком основании) для контроллера? В качестве альтернативы, как Google (я пытался некоторое время, но я понимаю, что яшарить в темноте (лаять случайное дерево).
Жетон снабжен заявками следующим образом.
Claim[] claims =
{
new Claim(ClaimTypes.Expiration, TokenExpiration.ToString(), ClaimValueTypes.DateTime),
new Claim(ClaimTypes.Name, userName, ClaimValueTypes.String),
new Claim(ClaimTypes.Role, member.Privilege + "", ClaimValueTypes.Integer),
new Claim(ClaimTypes.Version, "0.1", ClaimValueTypes.String),
new Claim(ClaimTypes.Webpage, "xxx.azurewebsites.net", ClaimValueTypes.String),
new Claim("NetworkId", member.Network.Id.ToString(), ClaimValueTypes.String),
new Claim("MemberId", member.Id.ToString(), ClaimValueTypes.String),
new Claim("Author", "yyy", ClaimValueTypes.String)
};
SymmetricSecurityKey key = new SymmetricSecurityKey(SecurityKey);
SigningCredentials credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
JwtSecurityToken token = new JwtSecurityToken(
"xxx.azurewebsites.net",
"xxx.azurewebsites.net",
claims,
DateTime.UtcNow,
TokenExpiration,
credentials);
string output = new JwtSecurityTokenHandler().WriteToken(token);
edit Startup устанавливается следующим образом.
services.AddSingleton<IUtilityService, UtilityService>();
services.AddSingleton<IEmailService, EmailService>();
services.AddCors(_ => _.AddPolicy("Open policy", __ => __
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(_ =>
{
_.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
ValidateActor = true,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey( ... )
};
});
services.AddAuthorization(_ => _.AddPolicy("Common", __ => ... ));
services.AddAuthorization(_ => _.AddPolicy("Super", __ => ... ));
services.AddAuthorization(_ => _.AddPolicy("Admin", __ => ... ));
services.AddMvc()
.AddJsonOptions(_ => ...);
services.AddSwaggerGen(_ => ... );
services.AddDbContext<Context>(_ => _.UseSqlServer( ... ));
редактировать заново Configure устанавливается следующим образом.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.Use(async (context, next) =>
{
try { await next(); }
catch (Exception) { context.Response.StatusCode = ... }
});
app.UseCors("Open policy");
app.UseAuthentication();
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(...);
}