2015-05-04 2 views
2

Я пишу приложение, которое должно постоянно удаляться/отсутствовать личная информация из базы данных . Учитывая, что кто-то может использовать свое настоящее имя в своем имени пользователя и что адрес электронной почты может присутствовать в своих записях AspUserIdentity, я решил, что одним из решений может быть хэш этих значений. Проще говоря: когда кто-то входит в систему с именем пользователя, я использую имя пользователя, которое они ввели, и вижу, существует ли этот хэш в базе данных; если это так, то я запишу их. Это легко сделать и прекрасно работает, изменяя методы Login и Register в AccountController. Но теперь я остался без знания введенного имени пользователя ...Хранение хеша имени пользователя с использованием идентификатора ASP.NET

Я мог просто сохранить имя пользователя в сеансе, но это кажется jankety. Я бы хотел сделать обновление cookie, которое отправляется при успешном входе в систему, чтобы использовать имя пользователя, которое они ввели (а не хешированное значение, хранящееся в БД). Таким образом User.Identity.GetUserName() возвращает имя пользователя обычного текста (а не хэшированное имя пользователя). Для клиента процесс должен быть прозрачным (и для меня, как и для программиста).

Вопрос в следующем: как? Какое лучшее место для этого? Я все еще относительно зелёный, когда речь заходит о новейших материалах ASP.NET Identity. Я вижу в Startup.Auth есть много сочных вещей, связанных с куки-файлами, но я не вижу, где бы я ни мог изменить файл cookie при входе в систему и до его отправки.

Все это глубоко внутри самого Овина?

Спасибо заранее,

ответ

1

Когда пользователь входит в систему и сравнить хеш имени пользователя, вы можете добавить свое реальное имя в качестве претензии к личности. Это сериализовать в печенье и доступны пользователю на каждом запросе, но не сохраняются в БД:

public async Task SignIn(string userName, string password, bool rememberMe) 
{ 
    var hashedUsername = getMyHash(username) 
    var loggedInUser = await userManager.FindAsync(hashedUsername, password); 
    if (loggedInUser == null) 
    { 
     // failed to login 
     return FailedToLogin(); // whatever you do there 
    } 

    // Ok, from now on we have user who provided correct username and password. 

    // and because correct username/password was given, we reset count for incorrect logins. This is for user lockout 
    await userManager.ResetAccessFailedCountAsync(loggedInUser.Id); 

    if (!loggedInUser.EmailConfirmed) 
    { 
     return EmailIsNotConfirmed(); // email is not confirmed - display a message 
    } 

    if (await userManager.IsLockedOutAsync(loggedInUser.Id)) 
    { 
     return UserLockedOut(); // user is locked out - display a message 
    } 

    var identity = await userManager.CreateIdentityAsync(loggedInUser); 
    identity.AddClaim(new Claim("OriginalUsername", originalUsername)); 

    var authenticationManager = context.GetOwinContext().Authentication; 
    authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = rememberMe }, identity); 

    //TODO redirect to a home page 
} 

Затем, когда вам нужно отобразить фактическое имя пользователя, а не хэш это сделать:

public static String GetOriginalUsername(this IPrincipal principal) 
{ 
    if (principal == null) 
    { 
     return String.Empty; 
    } 

    var claimsPrincipal = principal as ClaimsPrincipal; 

    if (claimsPrincipal == null) 
    { 
     return String.Empty; 
    } 

    var originalUsernameClaim = principal.Claims.SingleOrDefault(c => c.Type == "OriginalUsername"); 

    if (originalUsernameClaim == null) 
    { 
     return String.Empty; 
    } 

    return originalUsernameClaim.Value; 
} 

И вызовите этот метод на User.GetOriginalUsername() в файлах * .cshtml или в контроллерах. Или HttpContext.Current.User.GetOriginalUsername(), если вам это нужно в другом месте.

+1

Отлично. Именно то, что я искал. Приветствия. –

Смежные вопросы