2016-09-28 3 views
3

Я работаю над основным приложением ASP.NET в течение нескольких месяцев. Сейчас, закончив первую бета-версию, я понял, что не включил двухфакторную аутентификацию, и теперь я думаю, что я обнаружил ошибку в реализации для Microsoft.AspNetCore.Identity. Если мы посмотрим на то, как извлекаются пользователь, он делает это:Является ли Identity Core TwoFactorSignIn ошибкой?

/// <summary> 
    /// Returns the User ID claim value if present otherwise returns null. 
    /// </summary> 
    /// <param name="principal">The <see cref="ClaimsPrincipal"/> instance.</param> 
    /// <returns>The User ID claim value, or null if the claim is not present.</returns> 
    /// <remarks>The User ID claim is identified by <see cref="ClaimTypes.NameIdentifier"/>.</remarks> 
    public virtual string GetUserId(ClaimsPrincipal principal) 
    { 
     if (principal == null) 
     { 
      throw new ArgumentNullException(nameof(principal)); 
     } 
     return principal.FindFirstValue(Options.ClaimsIdentity.UserIdClaimType); 
    } 

    /// <summary> 
    /// Returns the user corresponding to the IdentityOptions.ClaimsIdentity.UserIdClaimType claim in 
    /// the principal or null. 
    /// </summary> 
    /// <param name="principal">The principal which contains the user id claim.</param> 
    /// <returns>The user corresponding to the IdentityOptions.ClaimsIdentity.UserIdClaimType claim in 
    /// the principal or null</returns> 
    public virtual Task<TUser> GetUserAsync(ClaimsPrincipal principal) 
    { 
     if (principal == null) 
     { 
      throw new ArgumentNullException(nameof(principal)); 
     } 
     var id = GetUserId(principal); 
     return id == null ? Task.FromResult<TUser>(null) : FindByIdAsync(id); 
    } 

Однако метод TwoFactorSignInAsync в SignInManager никогда не устанавливает претензии типа UserIdClaimType, но она устанавливает 4 раза один и то же Name требования, содержащий пользователь Id.
Является ли это ошибкой при реализации TwoFactorSignInAsync или некоторая конфигурация неверна в моей конфигурации Identity? Что это:

CookieAuthenticationOptions cookieOptions = new CookieAuthenticationOptions 
{ 
    CookieHttpOnly = true, 
    LoginPath = "/User/Login", 
    CookieSecure = CookieSecurePolicy.Always, 
    LogoutPath = "/User/Logout" 
}; 

services.AddIdentity<User, Role>(options => 
{ 
    options.Cookies.ApplicationCookie = cookieOptions; 
    options.Cookies.ExternalCookie = cookieOptions; 
    options.Cookies.TwoFactorRememberMeCookie = cookieOptions; 
    options.Cookies.TwoFactorUserIdCookie = cookieOptions; 

    options.Password = new PasswordOptions 
    { 
     RequiredLength = 8, 
     RequireLowercase = true, 
     RequireUppercase = true, 
     RequireNonAlphanumeric = true 
    }; 

    options.SignIn.RequireConfirmedEmail = true; 
}) 
.AddUserStore<MyStore>() 
.AddRoleStore<MyStore>() 
.AddDefaultTokenProviders(); 

Для выпуска GitHub, см Does TwoFactorSignIn contain a bug or am I configuring Identity incorrectly? #981

+5

Если вы считаете, что это ошибка, опубликуйте ее в треестере по проблеме с идентификатором ядра Core. https://github.com/aspnet/Identity/issues. StackOverflow не подходит для такого рода вещей – Tseng

+0

@Tseng Не уверен, что это ошибка, это может быть связано с тем, как я установил Identity –

+2

Вы все еще можете спросить об этом, вы обратитесь к разработчикам. если это ошибка, они отметят проблему. Если это неправильное использование, они могут дать вам правильный и закрыть проблему. В любом случае, он будет направлен разработчикам, которые могут судить его в лучшем случае – Tseng

ответ

0

По @HaoK's comment:

Два фактора знак в случае успеха, означает, что следующий запрос будет иметь набор пользователя , Аутентификация для текущего запроса уже произошла. Ни один из SignIn не влияет на текущий запрос.

Решение должно было удалить метод GetCurrentUserAsync после вызова TwoFactorSignInAsync, который я неправильно подумал, зарегистрировавшись у пользователя немедленно.

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