source

등록된 IUserTokenProvider가 없습니다.

lovecheck 2023. 5. 27. 11:47
반응형

등록된 IUserTokenProvider가 없습니다.

최근에 업데이트했습니다.Asp.Net Identity Core1.0에서 2.0까지 신청서를 제출합니다.

제가 해보고 싶었던 새로운 기능들이 있습니다.GenerateEmailConfirmationToken,기타.

저는 이 프로젝트를 참고 자료로 사용하고 있습니다.

사용자가 등록을 시도할 때 Register의 Post 메서드를 실행하는 동안 오류가 발생합니다.

private readonly UserManager<ApplicationUser> _userManager;     

public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var ifUserEXists = _userManager.FindByName(model.EmailId);
        if (ifUserEXists == null) return View(model);
        var confirmationToken = _userRepository.CreateConfirmationToken();//this is how i'm generating token currently.                
        var result = _userRepository.CreateUser(model,confirmationToken);
        var user = _userManager.FindByName(model.EmailId);
        if (result)
        {
            var code = _userManager.GenerateEmailConfirmationToken(user.Id);//error here
            _userRepository.SendEmailConfirmation(model.EmailId, model.FirstName, confirmationToken);
            //Information("An email is sent to your email address. Please follow the link to activate your account.");
            return View("~/Views/Account/Thank_You_For_Registering.cshtml");
        }     
    }
    
    //Error("Sorry! email address already exists. Please try again with different email id.");
    ModelState.AddModelError(string.Empty, Resource.AccountController_Register_Sorry__User_already_exists__please_try_again_);
    return View(model);
}

줄을 서서.

 var code = _userManager.GenerateEmailConfirmationToken(user.Id);

다음과 같은 오류가 발생합니다.

No IUserTokenProvider is registered.

지금은 어떤 코드를 생성하는지 알고 싶었습니다.변경해야 할 사항이 있습니까?ApplicationUser에서 상속되는 클래스IdentityUser수업?

아니면 그 기능을 작동시키기 위해 변경해야 할 것이 있습니까?

다음을 지정해야 합니다.UserTokenProvider토큰을 생성합니다.

using Microsoft.Owin.Security.DataProtection;
using Microsoft.AspNet.Identity.Owin;
// ...

var provider = new DpapiDataProtectionProvider("SampleAppName");

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
    provider.Create("SampleTokenName"));

다음 기사도 읽어보셔야 합니다.ASP.NET ID를 사용하여 응용 프로그램에 2단계 인증 추가.

ASP.NET Core에서는 다음과 같이 Startup.cs 에서 기본 서비스를 구성할 수 있습니다.

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

전화할 필요가 없습니다.DpapiDataProtectionProvider또는 그와 비슷한 것.디폴트토큰 공급자()가 전자 메일 확인 생성을 위한 통화를 처리합니다.사용자 관리자의 토큰입니다.

승인된 답변 외에도 이 접근 방식은 Azure Web-Sites에서 작동하지 않으며 토큰 대신 Cryptographic Exception을 사용할 수 있습니다.

Azure용으로 수정하려면 자체 IDataProtector를 구현하십시오. 다음 답변을 참조하십시오.

블로그 포스트에서 조금 더 자세히 설명

내 솔루션:

    var provider = new DpapiDataProtectionProvider("YourAppName");
    UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken")) 
        as IUserTokenProvider<User, string>;

이 코드에 대한 나의 문제는 해결되었습니다.
행운을 빌어요 친구들.

다른 사람이 저와 같은 실수를 저지를 경우에 대비해서요.저는 아래와 같은 기능을 만들려고 노력했는데 "No IUserTokenProvider is registered"라는 오류가 사라졌습니다.하지만 "callbackUrl"에서 생성된 링크를 사용하려고 하자마자 "Invalid token" 오류가 발생했습니다.작동하려면 HttpContext UserManager를 가져와야 합니다.개별 사용자 계정으로 표준 ASP.NET MVC 5 응용 프로그램을 사용하는 경우 아래와 같이 할 수 있습니다.

작동하는 코드:

public ActionResult Index()
     {
         //Code to create ResetPassword URL
         var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
         var user = userManager.FindByName("useremail@gmail.com");
         string code = userManager.GeneratePasswordResetToken(user.Id);
         var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
         return View();
     }

첫 번째 시도는 효과가 없습니다.No IUserTokenProvider is registered.가 사라졌지만 생성된 URL은Invalid token..

public ActionResult NotWorkingCode()
     {
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
             var provider = new DpapiDataProtectionProvider("ApplicationName");
             var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
             userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
             var user = userManager.FindByName("useremail@gmail.com");
             string code = userManager.GeneratePasswordResetToken(user.Id);
             var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
         return View();
     }

위의 pisker에 따라

startup.cs 에서 다음을 사용할 수 있습니다.

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

.net core 2.0에서 startup.cs 에 추가해야 할 수도 있습니다.

using Microsoft.AspNetCore.Identity;

이것은 저에게 잘 먹혔습니다.

.NET Core의 ID 파일을 수정하는 동안 다음 오류가 발생했습니다.

지원되지 않음예외:IUser2 요인 없음이름이 'Default'인 토큰 제공자가 등록되었습니다.

마이크로소프트.AsNetCore.신원.사용자 관리자.UserTokenAsync 생성

새 사용자를 등록할 때 사용할 수 있는 공급자가 없기 때문에 토큰을 생성할 수 없습니다.하지만 이 오류는 쉽게 해결할 수 있습니다!

당신이 나와 같다면, 당신은 변했어요.AddDefaultIdentity에 시대에Startup.cs을 로다철하에 합니다.AddIdentity기본 사용자로부터 상속받은 내 사용자를 구현하고 싶었습니다.이렇게 하면 기본 토큰 공급자가 손실됩니다.해결책은 그들을 다시 추가하는 것이었습니다.AddDefaultTokenProviders().

        services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

그 수정 후에, 모든 것이 다시 작동했습니다!

출처: https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-named-default-registered

아이덴티티 업데이트 후 동일한 오류가 발생하여 유니티를 사용하고 있었기 때문이라는 것을 알게 되었습니다.

솔루션에 대한 다음 질문 스레드를 참조하십시오.IAuthentication Manager를 Unity에 등록

또한 빠른 참조를 위해 아래에 있습니다.

다음은 ASP.NET Identity 2.0을 사용하여 Unity의 기능을 향상시키기 위해 수행한 작업입니다.

저는 다을추습다니에 했습니다.RegisterTypes의법에 있는 UnityConfig 명령어:

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<AccountController>(new InjectionConstructor());

또한 다음과 같은 항목을 살펴보실 수도 있습니다.
ASP.NET Identity 1.1 야간 빌드에서 토큰 공급자를 구현하는 방법은 무엇입니까?
Microsoft의 기본 토큰 공급자 구현을 사용합니다. package 윈키패지오

IdentityConfig.cs 에서 두 가지 요인 옵션을 추가합니다.

        manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        //config sms service 
        manager.SmsService = new Services.SMS();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }

ASP.NET Framework(단순 동기화 작업)에서도 유용합니다.

using Microsoft.Owin.Security.DataProtection;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
...

var userStore = new UserStore<IdentityUser>();
var userManager = new UserManager<IdentityUser>(userStore);
var user = userManager.FindByName(MyUserNameTextBox.Text);

var provider = new DpapiDataProtectionProvider(System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName());
userManager.UserTokenProvider = (IUserTokenProvider<IdentityUser, string>)(new DataProtectorTokenProvider<IdentityUser, string>(provider.Create("UserToken")) as IUserTokenProvider<IdentityUser, string>);

var token = userManager.GeneratePasswordResetToken(user.Id);
var result = userManager.ResetPassword(user.Id, token, MyPasswordTextBox.Text);

언급URL : https://stackoverflow.com/questions/22629936/no-iusertokenprovider-is-registered

반응형