최근에 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
새 사용자를 등록 할 때 사용할 수있는 공급자가 없기 때문에 함수에서 토큰을 생성 할 수 없습니다. 이 오류는 쉽게 수정할 수 있습니다!
당신이 나와 같다 AddDefaultIdentity
면 Startup.cs
파일을 AddIdentity
. 기본 사용자로부터 물려받은 내 사용자를 구현하고 싶었습니다. 이렇게함으로써 기본 토큰 공급자를 잃었습니다. 수정 사항은 AddDefaultTokenProviders()
.
services.AddIdentity<User, UserRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
수정 후 모든 것이 다시 작동했습니다!