#c# #asp.net-core
#c# #asp.net-core
Вопрос:
Я использую .NET Core 3.0 . Я пытаюсь аутентифицировать пользователя с помощью авторизации по ключу API. Я создал промежуточное программное обеспечение, которое вызывается каждый раз при вызове конечной точки контроллера. Я могу аутентифицировать пользователя и получать утверждения, но я не могу настроить HttpContext.User
объект на использование этого идентификатора.
public async System.Threading.Tasks.Task Invoke(HttpContext context, Services.AuthenticationService authenticationService, UserManager<IdentityUser> userManager, SignInManager<IdentityUser> _signInManager)
{
if (!context.Request.Path.ToString().Contains("Token") amp;amp; context.Request.Path.StartsWithSegments(new PathString("/api")))
{
var userKey = context.Request.Headers["user-key"];
// Register the user and its claims to the session
var user = authenticationService.GetUserFromToken(userKey);
var claims = await userManager.GetClaimsAsync(user);
if (claims == null)
{
context.Response.StatusCode = 401; //UnAuthorized
await context.Response.WriteAsync("Claims not found for user");
return;
}
var claimsIdentity = new ClaimsIdentity(IdentityConstants.ApplicationScheme);
claimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id));
claimsIdentity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
claimsIdentity.AddClaims(claims);
context.User.AddIdentity(claimsIdentity);
await _signInManager.Context.SignInAsync(IdentityConstants.ApplicationScheme, new ClaimsPrincipal(claimsIdentity));
}
await _next.Invoke(context);
}
Когда я проверяю HttpContext.User
в своем контроллере, у основного объекта identity нет информации. В объекте Identities есть два идентификатора. Второй идентификатор содержит утверждение и имя пользователя, которые я установил в промежуточном программном обеспечении.
Как мне настроить основной идентификатор на то, чтобы он был единственным идентификатором? _signInManager
Код на самом деле ничего не делает, и я получаю те же результаты в HttpContext.User
объекте с ним или без него.
Комментарии:
1.На мой взгляд, если вы проверили, что токен действителен, нет необходимости снова вызывать SignInAsync в вашем промежуточном программном обеспечении, вы могли бы напрямую задать утверждения, как показано ниже:
var claims = new List<Claim> { /* add claims */ };
var userIdentity = new ClaimsIdentity(claims, ClaimTypes.Name);
context.User = new ClaimsPrincipal(userIdentity);
2. Хорошо, итак, это было так же просто, как просто установить контекст. Пользователь = участнику claims. По какой-то причине я не ожидал, что это будет настраиваемый параметр. Спасибо за это. Однако я не могу принять ваш комментарий в качестве ответа.