developer tip

apicontroller의 OwinContext에서 UserManager를 가져올 수 없습니다.

copycodes 2020. 11. 11. 20:18
반응형

apicontroller의 OwinContext에서 UserManager를 가져올 수 없습니다.


Identity 2.0.0으로 이메일 유효성 검사를 구현하기 위해 Microsoft 샘플을 따르고 있습니다.

이 부분에 갇혀

public ApplicationUserManager UserManager
{
   get
   {
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
   }
   private set
   {
      _userManager = value;
   }
}

이것은에서 작동 controller하지만 ApiController에 메서드를 HttpContext포함하지 않습니다 .GetOwinContext

그래서 시도 HttpContext.Current.GetOwinContext()했지만 방법 GetUserManager이 존재하지 않습니다.

Startup.Auth.csUserManager 에서 빌드 하는 방법을 찾을 수 없습니다.

// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
    //Configure the db context, user manager and role manager to use a single instance per request
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
    ...
}

이 줄

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

다음 함수를 호출하여 UserManager

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
     };

     // Configure user lockout defaults
     manager.UserLockoutEnabledByDefault = true;
     manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
     manager.MaxFailedAccessAttemptsBeforeLockout = 5;

     manager.EmailService = new EmailService();

     var dataProtectionProvider = options.DataProtectionProvider;
     if (dataProtectionProvider != null)
     {
         manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
     }
     return manager;
}

어떻게하면이 액세스 할 수 있습니다 UserManagerApiController?


나는 당신의 질문을 일찍 오해했습니다. 몇 가지 using 문이 누락 된 것 같습니다.

GetOwinContext().GetUserManager<ApplicationUserManager>()에서입니다 Microsoft.AspNet.Identity.Owin.

따라서이 부분을 추가해보십시오.

using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity; // Maybe this one too

var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>();

This extension method may be a better solution if you want to unit test your controllers.

using System;
using System.Net.Http;
using System.Web;
using Microsoft.Owin;

public static IOwinContext GetOwinContext(this HttpRequestMessage request)
{
    var context = request.Properties["MS_HttpContext"] as HttpContextWrapper;
    if (context != null)
    {
        return HttpContextBaseExtensions.GetOwinContext(context.Request);
    }
    return null;
}

Usage:

public ApplicationUserManager UserManager
{
   get
   {
      return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
   }
   private set
   {
      _userManager = value;
   }
}

This single line of code saved my day...

       var manager = 
       new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));

You can use it within a controller action to get an instance of UserManager.

참고URL : https://stackoverflow.com/questions/24001245/cant-get-usermanager-from-owincontext-in-apicontroller

반응형