6

ASP.NET MVC 2 프로젝트를 시작한 후 자동으로 생성 된 코드를 구축하고 있습니다.리디렉션 전에 새로 로그인 한 사용자의 프로필을로드하는 방법

내가 겪고있는 문제는 사용자가 로그인 한 후 새로 로그인 한 사용자의 프로필이 HttpContext에로드되지 않은 것 같습니다. 따라서 ProviderException에 "이 속성 현재 사용자 프로필에서 속성 값을 설정하려고 할 때 "익명 사용자에 대해 설정할 수 없습니다." 후 로그온시의 조치에 대한

는 비주얼 웹 개발자 2010 Express는 기본적으로 생성 :

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); 

     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 
} 

: FormsService은 (또한 생성) 유형 FormsAuthenticationService의 컨트롤러의 속성입니다

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
     //... 

FormsService.SignIn(model.UserName, model.RememberMe) 라인 이후에 나는 새로 로그인 한 계정에 대한 정보를 컨트롤러에 즉시 사용할 수 있다고 가정 했었지만이 경우에는 나타나지 않습니다. 예를 들어, FormsService # SignIn 호출 아래에 profile.SetPropertyValue("MyProfileProperty", "test")을 추가하면 ProviderException "익명 사용자에 대해이 속성을 설정할 수 없습니다."가 표시됩니다.

HttpContext에 새로 로그인 한 사용자의 프로필을로드하여 다음 요청 전에 프로필에서 속성 값을 설정할 수 있도록하려면 어떻게해야합니까?

답변

6

함수의 이름은 카운터 직관적이지만, ProfileBase.Create (사용자 이름) 기존 사용자의 기존 프로파일을로드하거나 존재하지 않는 경우는 새 프로파일을 작성합니다 :이 게시물을 참조하십시오.

var profile = ProfileBase.Create(userName); 

ControllerContext.HttpContext.Profile으로 프로파일을로드 할 수 없습니다하지만 적어도 당신은에 액세스하거나 사용자 프로필을 변경할 수 있습니다.

+0

그러면 기존 프로필을로드하지 않고 새 프로필을 만들 수 있습니다. –

+0

아니요, 기존 프로필을로드한다는 가정은 잘못되었습니다. 그것을 밖으로 시도하십시오. –

+1

"인수로 사용자 이름을 사용하여 ProfileBase.Create()를 호출하면 TableStorage에 대한 조회가 수행되고 해당 사용자 이름과 연결된 데이터가 실제로 검색된다는 사실을 깨닫기까지는 다소 시간이 걸립니다. 오해의 소지가 있습니다. Load() 또는 Get()을 기대합니다. " 이 질문에 대한 답변을 참조하십시오 : http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

1

"원시"양식 인증은 MVC 템플릿에 내장되어 있어도 자동으로 프로필을로드하지 않습니다. 회원 테이블에 대해 사용자의 유효성을 검사하고 로그인 쿠키를 설정하는 것뿐입니다. 프로필 데이터가 로그인 할 때 세션 상태에 유지하려는 경우, 당신은 명시 적으로해야 할 것이다 :

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       LoadProfile(model.UserName); 
      } 
    } 

    private void LoadProfile(string UserName) 
    { 
      MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context 
      var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault(); 
      Session.Add("CurrentUser", user); 
    } 

UPDATE :

내가 원래의 질문을 오해. 익명 사용자의 경우 ProfileCommon 유형의 프로필을 만들어 저장해야합니다.

http://forums.asp.net/p/1150958/2619264.aspx

+0

로그인 후 "다음"페이지가로드되면 프로필이 세션에로드된다고 가정합니다. 맞습니까? –

+0

@Nick :이 구현에서 프로필은 리디렉션 전에 유효성 검사 즉시 세션에로드됩니다. –

+0

이것은 멍청한 질문 일 수 있습니다. 그러나 이것은 새로 로그인 한 사용자의 프로필 ('ControllerContext.HttpContext.Profile')을 어떻게로드합니까? –

관련 문제