Когда назначается личность пользователя при вызове контроллера? - PullRequest
0 голосов
/ 09 мая 2018

Я вызываю метод в моем контроллере и достигаю точки останова в его конструкторе.Проверка 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(...);
}

1 Ответ

0 голосов
/ 10 мая 2018

Я решил проблему, проанализировав канал событий (как упомянуто @amy) и заметил, что вызову действия предшествует OnActionExecuting метод (, показанный в PDF , любезно предоставлен @ sixtosaez).

public override void OnActionExecuting(ActionExecutingContext context)
{
  Claim claim = User.Claims
    .First(_ => _.Type == "MemberId");
  ...
}

Я полагаю, что можно также начать работать, изменив порядок регистрации промежуточного программного обеспечения в Start (как упомянуто @MarkG), но я не чувствую себя уверенно, играя с этим из-за noobness и растерянность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...