1

FormsAuthentication에서 무슨 일이 일어나는지 이해하지 못합니다. 처음 PC를 켜고 프로젝트를 시작할 때마다 로그인을 시도 할 때마다 쿼리 된 사용자 이름 (필자의 경우 닉네임)이 시퀀스를 찾을 수 없다는 오류 메시지가 나타납니다. 디버깅하는 동안 그 값을 확인, 그것은 null 문자열 ("") 밝혀졌습니다. 그런 다음 디버깅을 중지했다가 다시 시작하면 정상적으로 로그인하고 올바른 사용자 이름을 선택합니다.FormsAuthentication 동일한 티켓을 브라우저 전체에서 사용합니다 (동일한 PC에서)?

또 다른 브라우저에서 다른 사용자와 로그인하려고해도 똑같은 일이 발생하지만 결국 동일한 브라우저를 사용하여 로그인 한 동일한 사용자를 찾습니다! FormsAuthentication은 모든 브라우저에서 모든 사용자에 대해 동일한 티켓을 사용합니까? 그것에 대해 할 수있는 일이 있습니까? 아니면 제가 여기서 뭔가 잘못하고있는 것일 수 있습니까?

여기 내 코드입니다 :

[HttpPost] 
    public ActionResult Login(LoginViewModel dto) 
    { 
     bool flag = false; 
     if (ModelState.IsValid) 
     { 
      if (_userService.AuthenticateUser(dto.Email, dto.Password, false)) 
      { 
       var user = _userService.GetUserByEmail(dto.Email); 

       flag = true; 

       FormsAuthentication.SetAuthCookie(user.Nickname, dto.RememberMe); 
      } 
     } 
     if (flag) 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      ViewData.Add("InvalidLogin", "The login info you provided were incorrect."); 
      return PartialView(dto); 
     } 
    } 

    public User GetUserFromSession(bool withAllInfo) 
    { 
     string nickname = _httpContext.User.Identity.Name; 
     IsNotNull(nickname, "session user nickname"); 
     var user = _userService.GetUserByNickname(nickname, withAllInfo); 
     return user; 
    } 

    public User GetUserFromSession(string nickname, bool withAllInfo) 
    { 
     if (string.IsNullOrEmpty(nickname)) 
      return GetUserFromSession(withAllInfo); 

     var user = _userService.GetUserByNickname(nickname, withAllInfo); 
     return user; 
    } 

방법은 위 (HttpContext를의 인스턴스를 소요 - StructureMap를 사용) 도우미 클래스입니다. 다른 사용자와 로그인 한 경우에도 계속해서 닉네임이 J.Smith 인 사용자를 반환합니다. 재미있는 점은 Summary ActionMethod (아래 참조)를 사용하여 올바르게 로그인 한 사용자를 표시한다는 것입니다.

[Authorize] 
    public ActionResult Summary() 
    { 
     var nickname = this.HttpContext.User.Identity.Name; 
     var user = _helper.GetUserFromSession(nickname, true); 
     var viewModel = Mapper.Map<User, UserInfoSummaryViewModel>(user); 
     return PartialView(viewModel); 
    } 

이 방법은 등 자신의 입찰, 목록, 새 메시지 ...이 실제로 (대부분의 경우) 제대로 작동을 포함하여 사용자의 정보를 모두의 요약을 표시합니다. 그러나 문제는 모든 것을 엉망으로 만드는 GetUserFromSession() 방법입니다.

public ActionResult SignOut() 
    { 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 

내가 할 필요가 밖으로 사용자에 서명하고 자신의 쿠키/세션을 삭제 또는 무엇이든하고 FormsAuthentication 세션을 관리 할 않는 것을인가?

참고 : 기본 제공 멤버쉽 API를 사용하고 있지 않으므로 사용하고 싶지 않습니다.

그래서이 난장판을 고칠 수있는 방법이 있습니까?

UPDATE :

StructureMap 구성 :

이 유지되는 _httpContext 인스턴스 FO 범위 같은데
private static IContainer ConfigureStructureMap() 
    { 

     ObjectFactory.Configure(x => 
          { 
           x.For<IDatabaseFactory>().Use<EfDatabaseFactory>(); 
           x.For<IUnitOfWork>().Use<UnitOfWork>(); 
           x.For(typeof (IRepository<>)).Use(typeof (BaseRepository<>)); 
           x.For<IGenericMethodsRepository>().Use<GenericMethodsRepository>(); 
           x.For<IUserService>().Use<UsersManager>(); 
           x.For<IBiddingService>().Use<BiddingService>(); 
           x.For<ISearchService>().Use<SearchService>(); 
           x.For<IFaqService>().Use<FaqService>(); 
           x.For<IItemsService>().Use<ItemsService>(); 
           x.For<IPrivateMessagingService>().Use<PrivateMessagingService>(); 
           x.For<IStaticQueriesService>().Use<StaticQueriesService>(); 
           x.For<ICommentingService>().Use<CommentingService>(); 
           x.For<ICategoryService>().Use<CategoryService>(); 
           x.For<IHelper>().Use<Helper>(); 
           x.For<HttpContext>().Use(HttpContext.Current); 

      x.For(typeof(Validator<>)).Use(typeof(NullValidator<>)); 

      x.For<Validator<Rating>>().Use<RatingValidator>(); 
      x.For<Validator<TopLevelCategory>>().Use<TopLevelCategoryValidator>(); 
     }); 

     Func<Type, IValidator> validatorFactory = type => 
     { 
      var valType = typeof(Validator<>).MakeGenericType(type); 
      return (IValidator)ObjectFactory.GetInstance(valType); 
     }; 

     ObjectFactory.Configure(x => x.For<IValidationProvider>().Use(() => new ValidationProvider(validatorFactory))); 
     return ObjectFactory.Container; 
    } 

답변

0

현재 HttpContext.Current 인스턴스를 반환하는 HttpContext 공급자 클래스 (인터페이스)를 작성할 수 있습니다.

using System.Web; 

interface IHttpContextProvider 
{ 
    HttpContextBase HttpContext { get; } 
} 

public class HttpContextProvider : IHttpContextProvider 
{ 
    HttpContextBase HttpContext 
    { 
     get 
     { 
      return new HttpContextWrapper(System.Web.HttpContext.Current); 
     } 
    } 
} 
0

/StrucutureMap 만든이 올바르지 않습니다. Here's 범위에 대한 좀 더 자세한 정보 - StrucutureMap 등록 코드를 게시하고 싶다면 더 자세히 살펴 보겠습니다.

+1

당신은 옳습니다. 현재 인증 된 사용자를 컨트롤러로 가져 오는 코드를 옮길 때 문제가 해결되었습니다! 업데이트를 확인하고, StructureMap 코드를 추가했습니다 ... 감사합니다 :) – Kassem

+0

@Kassem : 좋습니다. 그래서 당신의 등록은 아마도'x.For () .CacheBy (InstanceScope.HttpContext) .Use (HttpContext.Current); '또는 이와 비슷한 것으로 보일 것입니다. 그것을 시도하고 그것이 작동하는 경우 알려 주시기 바랍니다. – ataddeini

+0

불행히도, 그것은 작동하지 않았다. 그리고 저는 이제 그 문제 때문에 많은 문제에 직면하고 있습니다 (아마도). 심지어 내 Session 변수가 ActionMethods 사이에 정의되지 않습니다 ... – Kassem

관련 문제