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;
}
당신은 옳습니다. 현재 인증 된 사용자를 컨트롤러로 가져 오는 코드를 옮길 때 문제가 해결되었습니다! 업데이트를 확인하고, StructureMap 코드를 추가했습니다 ... 감사합니다 :) – Kassem
@Kassem : 좋습니다. 그래서 당신의 등록은 아마도'x.For() .CacheBy (InstanceScope.HttpContext) .Use (HttpContext.Current); '또는 이와 비슷한 것으로 보일 것입니다. 그것을 시도하고 그것이 작동하는 경우 알려 주시기 바랍니다. –
ataddeini
불행히도, 그것은 작동하지 않았다. 그리고 저는 이제 그 문제 때문에 많은 문제에 직면하고 있습니다 (아마도). 심지어 내 Session 변수가 ActionMethods 사이에 정의되지 않습니다 ... – Kassem