#c# #api #owin-middleware
#c# #API #owin-промежуточное программное обеспечение
Вопрос:
я пытаюсь сохранить
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new GenericIdentity(user.UserName), new string[] { /* fill roles if any */ });
string f = HttpContext.Current.User.Identity.Name;
// здесь он успешно показывает имя пользователя в методе входа в систему, но когда я попытаюсь позже другим способом получить user.identity.name это возвращаемое значение null я опубликую свой метод входа в систему я использовал owin identity
и после входа в систему он всегда не аутентифицирован или авторизован
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
try
{
var result = await SignInManager.PasswordSignInAsync(model.username, model.Password, isPersistent: true, shouldLockout: false);
var user = await UserManager.FindByNameAsync(model.username);
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true },
await user.GenerateUserIdentityAsync(UserManager));
if (result == SignInStatus.Success amp;amp; user != null)
{
int temp_loginTimes = user.login_times;
temp_loginTimes ;
user.login_times = temp_loginTimes;
user.last_login = Convert.ToDateTime(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture));
user.ip = model.ip;
user.device_type = model.device_type;
var res = await UserManager.UpdateAsync(user);
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new GenericIdentity(user.UserName), new string[] { /* fill roles if any */ });
string f = HttpContext.Current.User.Identity.Name;
FormsAuthentication.SetAuthCookie(model.username, true);
if (res.Succeeded == true)
{
LoginHistoryBLL loginHistory = new LoginHistoryBLL();
var rese = loginHistory.SaveLogInDetails(new LoginHistoryDTO() { username = user.UserName, logindate = (DateTime)user.last_login, creater = user.creater, type = user.type, device = model.device_type, ip = model.ip });
UserDTO userDTO = new UserDTO();
if (rese.ok == true) {
userDTO.username = user.UserName;
userDTO.creater = user.creater;
userDTO.login_times = user.login_times;
userDTO .balance = user.balance;
userDTO.password= user.PasswordHash;
userDTO.type = user.type;
userDTO.bonus = user.bonus;
userDTO.balance_in = user.balance_in;
userDTO.balance_out = user.balance_out;
userDTO.device_type = user.device_type;
userDTO.status = user.status;
userDTO.percantageOfLuck = user.percantageOfLuck;
userDTO.double_bunos_active = user.double_bunos_active;
userDTO.level = user.level;
string gf = User.Identity.Name; //until here work everything fine
return Ok(userDTO);
}
else
return BadRequest("user not saved in history");
}
else
{
return BadRequest("user not updated");
}
}
else
{
return BadRequest("user not assign");
}
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
но, например: в этом методе я ничего не получаю
// POST api/Account/getuserwithcreater
[Route("getuserwithcreater")]
[HttpGet]
public async Task<IHttpActionResult> GetUsersAsync()
{
using (var context = new ApplicationDbContext())
{
ApplicationUser curuser = await UserManager.FindByIdAsync(User.Identity.GetUserId());
List<UserDTO> us = new List<UserDTO>();
foreach (var item in UserManager.Users)
{
if (item.creater == User.Identity.Name)
{
UserDTO userDTO = new UserDTO(); ;
userDTO.username = item.UserName;
userDTO.creater = item.creater;
userDTO.login_times = item.login_times;
userDTO.balance = item.balance;
userDTO.password = item.PasswordHash;
userDTO.type = item.type;
userDTO.bonus = item.bonus;
userDTO.balance_in = item.balance_in;
userDTO.balance_out = item.balance_out;
userDTO.device_type = item.device_type;
userDTO.status = item.status;
userDTO.percantageOfLuck = item.percantageOfLuck;
userDTO.double_bunos_active = item.double_bunos_active;
userDTO.level = item.level;
us.Add(userDTO);
}
}
return Ok(us);
}
}
Комментарии:
1. Похоже, у вас есть конечная точка входа в систему, вы должны выполнять эту аутентификацию в конвейере owin в качестве самого промежуточного ПО аутентификации и использовать
ClaimsIdentity
2. на самом деле я не знаком с identity, пожалуйста, не могли бы вы подробнее объяснить, пожалуйста