전자 메일 주소를 사용자 이름으로 허용하도록 Microsoft.AspNet.Identity 구성


121

새 응용 프로그램을 만드는 중이며 EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity를 사용하여 시작했습니다. .Owin 1.0.0-rc1 등, 어제 RTM 릴리스를 통해 오늘 저녁 NuGet을 통해 RTM으로 업데이트했습니다.

지금까지 수행 한 작업에 대한 몇 가지 코드 변경을 제외하고 앱에 대한 로컬 사용자 계정을 만들려고 할 때까지 모든 것이 잘 진행되는 것처럼 보였습니다.

릴리스 후보에서 잘 작동하는 사용자 이름 형식 인 전자 메일 주소를 작업했지만 이제 사용자 이름에 대한 전자 메일 주소로 사용자를 만들 때 다음 유효성 검사 오류가 발생합니다.

사용자 이름 xxxxx@xxxx.com이 잘못되었습니다. 문자 또는 숫자 만 포함 할 수 있습니다.

지난 1 시간 동안 구성 옵션에 대한 솔루션이나 문서를 검색했지만 아무 소용이 없습니다.

사용자 이름에 전자 메일 주소를 허용하도록 구성 할 수있는 방법이 있습니까?


1
((UserValidator<ApplicationUser>) UserManager.UserValidator).AllowOnlyAlphanumericUserNames = false;
Arvis

답변:


164

UserManager에서 사용자 고유의 UserValidator를 연결하거나 기본 구현을 해제하여이를 허용 할 수 있습니다.

UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }

3
사용자 지정 UserValidator를 만드는 방법은 무엇입니까?
teh0wner

2
코드 (기본 mvc5 앱)에서 정확히 어디에 UserManager.UserValidator = new UserValidator <TUser> (UserManager) {AllowOnlyAlphanumericUserNames = false}를 넣어야합니까? 감사.
PussInBoots 2013

29
AccountController에서 public AccountController(UserManager<ApplicationUser> userManager)생성자에 추가UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
LiamGu

1
@graycrow 나는 Asp.net 멤버십이 어떻게 작동하고 사용하기 쉬웠는지에 대해 계속 외쳤다. 나는 그것을 VS에서 액세스 할 수있는 구성 웹 사이트를 사용 즐겼다 ..
머핀 맨

@graycrow asp.net ID의 현재 상태를 감안할 때 SqlMembership Provider의 시대를 그리워합니다. 더 큰 관점은 다음을 참조하십시오 : brockallen on asp net identity
subsci

16

이 C # 버전 (App_Code \ IdentityModels.cs에 있음)은 다음과 같습니다.

public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }

9

필자의 경우 ASP.NET Identity 2.0을 사용하여 VS 2013 C #, MVC 5.2.2에서 실행되는 솔루션은 App_Start \ IdentityConfig.cs 내에서 ApplicationUserManager 생성자를 다음과 같이 업데이트하는 것입니다.

public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }

5

동일한 문제가 발생했습니다. 사용자 이름이 이메일이 아닌 사람의 실제 이름이되도록 코드를 변경하려고 할 때 시스템이 동일한 오류 메시지를 표시합니다. "사용자 이름 ABC DEF가 유효하지 않습니다. 문자 나 숫자 만 포함 할 수 있습니다. . " AllowedUserNameCharacters에 공백 문자 (내 경우에는 마지막)를 추가하는 문제를 해결했습니다.

Asp.Net Core 2.2 및 VS2017을 사용하는 Im

이것은 내 코드입니다

Startup.cs로 이동하여 "// user settings"아래에 줄을 편집하거나 추가합니다.

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings.
            options.Password.RequireDigit = true;
            options.Password.RequireLowercase = true;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequiredLength = 6;
            options.Password.RequiredUniqueChars = 1;

            // Lockout settings.
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.AllowedForNewUsers = true;


            // User settings.
            options.User.AllowedUserNameCharacters =
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
            options.User.RequireUniqueEmail = false;
        });

        services.ConfigureApplicationCookie(options =>

4

ASP.Net 웹 양식을 사용 중이고이를 수행하려는 경우 IdentityModels.vb / cs 파일을 열고 Public Class UserManager 아래에서 다음과 같이 보이게합니다.

Public Class UserManager
Inherits UserManager(Of ApplicationUser)

Public Sub New()
    MyBase.New(New UserStore(Of ApplicationUser)(New ApplicationDbContext()))
    Users = store
    UserValidator = New UserValidator(Of ApplicationUser)(Me) With {.AllowOnlyAlphanumericUserNames = False}
End Sub

Public Property Users() As IUserStore(Of ApplicationUser)
    Get
        Return m_Users
    End Get
    Private Set(value As IUserStore(Of ApplicationUser))
        m_Users = value
    End Set
End Property
Private m_Users As IUserStore(Of ApplicationUser)

End Class

4

AspNet.Identity.Core 2.1 이상 사용자의 경우 UserManager의 이러한 유효성 검사기는 읽기 전용입니다. 사용자 이름으로 이메일 주소는 기본적으로 허용되지만 사용자 이름의 문자를 추가로 사용자 정의해야하는 경우 Startup.cs에서 다음과 같이 할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>(options => {
        options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/";
    });

    // ... etc
}

(레거시 이유로 '/'가 필요했습니다.)


1

내 자신의 ApplicationUserManager : UserManager 클래스를 코딩하는 것이 나에게 적합하지 않았기 때문에 (아마도 MVC가 아닌 Razor Pages를 사용했을 수도 있음) 여기에 또 다른 해결책이 있습니다. CofigureServices ()의 Startup.cs에서 ID 옵션을 구성 할 수 있습니다.

services.Configure<IdentityOptions>(options =>
{
  options.User.AllowedUserNameCharacters = 
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@";
  options.User.RequireUniqueEmail = true;
});

이 항목에 대한 자세한 내용은 Microsoft Docs : https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2


0

IdentityConfig.cs를 찾을 수 없으면 AccountController 생성자를이 코드로 바꿉니다.

public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
  {
      AllowOnlyAlphanumericUserNames = false  
  };
}

0

제 경우에는 인증 작업을하는 리포지토리 클래스가 있었는데 사용자 이름 안에 "-"를 사용할 수 없었습니다. 수정은 여기 생성자 내부에있었습니다.

//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
    _ctx = new AuthContext();
    _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
    _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}

0

요즘에는 대부분의 사용자 이름이 전자 메일이기 때문에이 문제를 고수했지만 별도의 전자 메일 필드의 이유를 이해할 수 있습니다. 이것들은 순전히 내 생각 / 경험이며 Microsoft의 말을 찾을 수 없었습니다.

Asp Identity는 순전히 누군가를 식별하기위한 것이므로 식별 할 이메일이있을 필요는 없지만 ID의 일부를 형성하기 때문에이를 저장할 수 있습니다. Visual Studio에서 새 웹 프로젝트를 만들 때 인증 옵션에 대한 옵션이 제공됩니다.

MVC와 같은 비어 있지 않은 프로젝트 유형을 선택하고 인증을 "개별 계정"으로 설정하면 사용자 관리를위한 기본 토대가 제공됩니다. 그중 하나는 App_Start \ IdentityConfig.cs 내에 다음과 같은 하위 클래스를 포함합니다.

 // Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
    }
    //N.B rest of code removed
}

이것이 의미하는 바는 Microsoft가 더 복잡한 사용자 이름을 저장하려고한다는 것입니다 (AllowOnlyAlphaNumericUserNames = false 참조). 따라서 실제로 신호가 혼합되어 있습니다.

이것이 기본 웹 프로젝트에서 생성된다는 사실은 사용자 이름 필드에 전자 메일을 입력 할 수 있도록 Microsoft에서 좋은 지시 / 지시를 제공합니다 (그리고 깨끗한 방법). Microsoft.OWIN 컨텍스트로 응용 프로그램을 부트 스트랩 할 때 App_Start \ Startup.Auth.cs 내에서 정적 생성 메서드가 사용되기 때문에 깔끔합니다.

이 접근 방식의 유일한 단점은 이메일을 두 번 저장하게된다는 것입니다 .... 좋지 않습니다!



0

계정 컨트롤러에서 일종의 IOC를 사용하는 경우 (StructureMap을 사용 중입니다) Usermanager가 전달 될 때 위에서 언급 한 Hao Kung 수정 사항을 적용해야합니다 . IOC 설정에 방법이있을 수 있지만 방법을 모르겠습니다.

public AccountController(ApplicationUserManager userManager)
    {
        _userManager = userManager;
        _userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

0

나는 같은 문제에 직면했다. 그러나 마지막으로 생성자가 아닌 내 메서드에 벨로우즈 부분을 추가하여 문제를 해결했습니다.

public void MyMethod(){

     UserManager<ApplicationUser> manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));


                    // Configure validation logic for usernames  
                    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
                    {
                        AllowOnlyAlphanumericUserNames = false,
                        RequireUniqueEmail = true

                    };         

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.