[c#] IUserTokenProvider가 등록되지 않았습니다.

최근에 Asp.Net Identity Core신청서 1.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. DefaultTokenProviders ()는 UserManager에서 GenerateEmailConfirmationToken에 대한 호출을 처리합니다.


답변

허용되는 답변 외에도이 접근 방식이 Azure 웹 사이트에서 작동하지 않으며 토큰 대신 CryptographicException이 표시된다는 점을 추가하고 싶습니다.

Azure에서 수정하려면 고유 한 IDataProtector를 구현하세요. 이 답변을 참조하세요.

블로그 게시물 에서 약간 더 자세히


답변

내 솔루션 :

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

이 코드에 대한 내 문제가 해결되었습니다.
행운을 빕니다.


답변

다른 사람이 저와 같은 실수를했을 경우를 대비해 아래의 함수를 만들려고했는데 “IUserTokenProvider가 등록되지 않았습니다.”라는 오류가 충분히 발생했는지 확인했습니다. 사라졌다. 그러나 “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 파일을 수정하는 동안이 오류가 발생했습니다.

NotSupportedException : ‘Default’라는 IUserTwoFactorTokenProvider가 등록되지 않았습니다.

그만큼

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

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

당신이 나와 같다 AddDefaultIdentityStartup.cs파일을 AddIdentity. 기본 사용자로부터 물려받은 내 사용자를 구현하고 싶었습니다. 이렇게함으로써 기본 토큰 공급자를 잃었습니다. 수정 사항은 AddDefaultTokenProviders().

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

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

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