5

ユーザーが ASP.net Web サイトにログインしたときに通知を受け取る方法はありますか?

: ユーザーは「ログイン ページ」にアクセスしなくてもログインできます。「remember me」Cookie が存在する場合、任意のページにアクセスしてログインできます。

ユーザーがログインしているときに、セッション関連の情報を取得したいと考えています。

Login.LoggedInイベントがあります。問題は、そのコントロールがすべてのページに存在しないことです。そして、それが存在する1つのページ( )はイベントLogin.aspxを呼び出しません。OnLoggedIn

Global.asaxグローバルなOn Session Start通知があるのと同じ方法で:

void Session_Start(object sender, EventArgs e) 
{
}

どこかにOn User Logged In通知があると思います:

void LoggedIn(object sender, EventArgs e)
{
}

ボーナスリーディング

4

4 に答える 4

7

あなたにはそれを行うためのユニークな場所がないと思います。私の場合(MVC + log4net)、これを使用します:

  • Global.asax既存の Cookie を使用して、認証されたユーザーを確認します。

    protected void Session_Start()
    {
        string ip = HttpContext.Current.Request.UserHostAddress;
    
        log.InfoFormat("Starting session: {0} from {1}.",Session.SessionID, ip);
    
        if ((HttpContext.Current != null) &&
            (HttpContext.Current.User != null) &&
            (HttpContext.Current.User.Identity.IsAuthenticated) )
        {
            string user = HttpContext.Current.User.Identity.Name;
            string type = "Cookie";
    
            log.InfoFormat("User {0} logged in with {1}.", user, type);
        }
    
    }
    
  • アカウント コントローラーで、ローカル ログインを確認します (MVC4 のインターネット アプリケーション テンプレートを使用していますがLogin.OnLoggedIn、Web フォームを使用している場合は、これを行うことができます)。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.EMail, model.Password, persistCookie: model.RememberMe))
        {
            string user = model.EMail;
            string type = "Forms";
    
            log.InfoFormat("User {0} logged in with {1}.", user, type);
    
            return RedirectToLocal(returnUrl);
        }
    
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        log.ErrorFormat("Bad password or user name. User={0}", model.EMail, model.Password);
        return View(model);
    }
    
  • ただし、次のように OAuth ログインも確認する必要があります。

    [AllowAnonymous]
    public ActionResult ExternalLoginCallback(string returnUrl)
    {
        AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
        if (!result.IsSuccessful)
        {
            log.Debug("External login failure.");
    
            return RedirectToAction("ExternalLoginFailure");
        }
    
        if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
        {
            log.InfoFormat("User {0} logged in with External {1} login. External UserID = {2}",
                Membership.GetUser(OAuthWebSecurity.GetUserName(result.Provider, result.ProviderUserId)).UserName,
                result.Provider,
                result.ProviderUserId);
    
            return RedirectToLocal(returnUrl);
        }
    
        ...
    }
    
于 2012-10-25T08:28:15.373 に答える
3

global.asax でチェックを行うことができApplication_AuthenticateRequestます。これは、リクエストがセッション データと一緒にログインされているかどうかを確認し、セッション データの初期化が必要かどうかを判断できる場所です。

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    //  check for logged in or not
    if (null != authCookie)
    {
        // is logged in... check if the session needs init

    }   
}

または同じ結果

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    //  check for logged in or not
    if(HttpContext.Current.User != null && 
        HttpContext.Current.User.Identity != null 
            && HttpContext.Current.User.Identity.IsAuthenticated)
    {
        // is logged in... check if the session needs init

    }   
}    
于 2012-06-12T18:11:16.090 に答える
2

技術的にはログインすることは認証されることと同じですが、私はこれについて別のメンタル モデルを持っています。

私の考えでは、次の 3 つのことは別の問題です。

  • ユーザーがセッションを持っている/取得している
  • ユーザーが認証されました
  • ユーザーがログインしています

私にとって、これらの最後の 1 つは、「ユーザーに対してセッションが作成され、ユーザーが認証され、認証されたユーザーに対してセッションが初期化された」ことを意味します。

このモデルを使用すると、ユーザーは次の場合にログインできます。

  • ユーザーがログイン ページにログインすると、既存のセッションが必要なユーザー データで初期化されます。
  • 事前認証されたユーザーがサイトにアクセスし、新しいセッションが作成されて初期化されます

同様に、初期化されたセッションが破棄されると、ユーザーはログアウトされます。

このモデルを使用すると、次のことを意味します。

  • Login.OnLoggedInイベント または のSession_Startイベントで、ユーザーがいつ「ログイン」したかを識別できますGlobal.asax。もちろん、認証されていないユーザーに対してもセッション開始イベントが発生するため、イベントが発生したときにユーザーが認証されていることを確認する必要があります。
  • Session_End明示的にログアウトするか、適切に初期化されたセッションが Global.asax のイベントで破棄されたときに、ユーザーがいつ「ログアウト」したかをある程度確実に知ることができます。アプリケーションプールがクラッシュでリサイクルまたは終了したときに、Session_Endイベントが必ずしも発生するとは限らないと思うので、ある程度確実に言います。私はこれをテストしていませんが、間違っているかもしれません。
  • ユーザーは同時に複数回「ログイン」できます。少なくとも IE では、[ファイル] メニューから「新しいセッション」を開始できます。これにより、セッション Cookie を既存の IE ウィンドウと共有しない新しい IE が開始されます。これは、ユーザーがサイトにアクセスしたときにサーバーによって新しいセッションが作成されることを意味し、使用される認証メカニズムによっては、ユーザーも再度認証する必要があることを意味する場合があります。

すぐに「現在ログインしているすべてのユーザーを一覧表示する」ことはできません。自分でそれを追跡する方法を作成する必要があると思います。これは多かれ少なかれ難しいことです。特に、アプリケーションがある種の負荷分散環境で実行されている場合、現在のすべてのユーザーのリストを取得するのは難しい場合があります。

于 2012-06-14T10:14:32.153 に答える
2

これらの 2 つの場所でコードを呼び出すことができます:コントロールOnLoggedInからのイベントと、 Login(Global.asax でイベントを使用して) セッションが開始されたとき、Session_Startこれはユーザー データを使用した最初の要求になるためです。そこで、ユーザーがログインしているかどうかを確認し、ログインしている場合は必要なことを行います。

于 2012-06-12T18:07:05.587 に答える