2011-12-25 9 views
3

ユーザーがシステムにログインした後、変数をSessionに入れる必要があります。私は、拡張メソッドでこれをやっている:Controllerの外のクラスでUser.Identityを操作する方法

ログイン方法:

[HttpPost] 
     public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (Membership.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

        int id = this.HttpContext.GetFirmaId(); 
        String username = this.HttpContext.User.Identity.Name; 

        //SessionExtensions.SetFirmaId(Session, model.UserName); 

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         if (User.IsInRole("Administrator")) 
         { 
          RedirectToAction("Index", "Admin"); 
         } 
         else 
         { 
          return RedirectToAction("Index", "Home"); 
         } 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "Brugernavn eller password er forkert."); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 

拡張方法:

public static int GetFirmaId(this HttpContextBase context) 
    { 

     var firmaid = context.Session["firmaid"] as int?; 

     if (firmaid == null) 
     { 
      // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes 

      firmaid = SetFirmaId(context.Session, context.User.Identity.Name); 

     } 

     return (int)firmaid; 
    } 

問題はcontext.User.Identity.Nameが空の文字列を返すことです。

どうすればこの問題を解決できますか?お使いのコントローラからちょうどthis.HttpContext.GetFirmaId()ように使用:コメントごとなど -

+1

どこを呼びますか?なぜあなたは 'HttpContextBase'を拡張していませんか? – SLaks

+0

私はヘルパーとして使用する静的なクラスでそれを呼び出す。どのように私はHttpContextBaseを使用するのですか?それにはEqualsメソッドとReferenceEqualsメソッドがあります。 – Kenci

+1

'HttpSessionStateBase'の代わりにパラメータとして取ります。 – SLaks

答えて

0

はUPDATE

public static int GetFirmaId(this HttpContextBase context) 
     { 

      var firmaid = context.Session["firmaid"] as int?; 

      if (firmaid == null) 
      { 
       // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes 

       firmaid = SetFirmaId(context.Session, context.User.Identity.Name); 

      } 

      return (int)firmaid; 
     } 

を試してみてください。

いくつかの便利なリンク:

UPDATE 2 - コメントどおり:

であることの問題は質問に接続していません。上記の答えは、コントローラの外にあるクラスでアクセスするために行うべきことです。

デバッガのOPソーでは、この特定のケースではコントローラ内で空でもあります。プロセスで「早すぎる」とアクセスされていると思われます。

AccountControllerをお手伝いする必要がある場合は、新しい質問をしてください。

+0

どこからHttpContext.Current.GetFirmaId()を使うことができますか?それは私のコントローラに表示されません。コントローラからGetFirmaIdを呼び出すとき、VSは引数を必要としていると言います。 – Kenci

+0

@Kenci上記の私の更新を参照してください。 – Yahia

+1

@Kenci: 'HttpContext.GetFirmaId()'。 ( 'HttpContext'は' HttpContextBase'インスタンスを返すプロパティです)拡張メソッドがどのように機能するのかを理解する必要があります。 – SLaks

関連する問題