web-dev-qa-db-ja.com

ASP.NETメンバーシップ:ユーザーをログイン状態に設定する方法

メンバーシッププロバイダーを機能させようとしています。

これまでのところ:

 <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate">
 </asp:Login>

呼び出し:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    if(Membership.ValidateUser(Login1.UserName, Login1.Password))
    {
        Response.Redirect("/admin/default.aspx");
        // Set the user as logged in?
    }
}

正しいログイン/パスワードを入力すると、ValidateUser関数はtrueを返します。だから私の質問は次のとおりです。ログインするようにユーザーを設定するにはどうすればよいですか?

私は私のページでこれをテストしています:

protected void Page_Load(object sender, EventArgs e)
{
    if ( Membership.GetUser()==null)
    {
        Response.Redirect("/admin/login.aspx");
    }
    // else "you are logged in, congratulations"                
}

デフォルトの機能を使用していましたが、機能していなかったため、Google検索で自分ですべてを実際に再コーディングすることで時間を節約できると思いました

何でも役に立ちます!

[〜#〜] edit [〜#〜]:受け入れられた回答に関しては、「ログインしたユーザーを設定する方法」に対する正しい回答であり、正常に動作します。特定の問題は修正されませんでしたが、その一部のみが修正されました。あなたがコメントを考えて見れば、あなたは面白いポインタを見つけるだろうと思った。

EDIT 2と解決策:Ok私はすべてのコメントのおかげで最終的にそれを解決しました。ここに私がやったこと、それは私が予想したよりも簡単です:

ログイン状態を確認するページ:

 protected void Page_Load(object sender, EventArgs e)
 {
     if ( !Request.IsAuthenticated)
     {
         Response.Redirect("/admin/login.aspx");
     }  

ログアウト:

   protected void LoginStatus1_Logout(object sender, LoginCancelEventArgs e)
   {
       FormsAuthentication.SignOut();
       Response.Redirect("/admin/login.aspx");
   }
}

web.config:

<authentication mode="Forms" />

ログインする:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    if(Membership.ValidateUser(Login1.UserName, Login1.Password))
    {
        FormsAuthentication.SetAuthCookie(Login1.UserName, true);
        Response.Redirect("/admin/default.aspx");

    }
}
29
marcgg

Response.Redirect("/admin/default.aspx");を呼び出す前に、これをLogin1_Authenticateに入れてください

FormsAuthentication.SetAuthCookie("username", true);
38
Gromer

コードとGromerの提案をLoggedInイベントに移動してみてください。

protected void Login1_LoggedIn(object sender, EventArgs e)
    {
        if(Membership.ValidateUser(Login1.UserName, Login1.Password))
        {
            FormsAuthentication.SetAuthCookie(Login1.UserName, true);
            Response.Redirect("/admin/default.aspx");
        }

    }

編集:Gromerが言ったように、ユーザーがログインしてからリダイレクトされるまでの間にビジネスコードを実行する必要がある場合にのみ、これを行います。

編集編集:Visual Studioは、Authenticateイベントを「ユーザーを認証するために呼び出される」と説明します。これは、イベントが呼び出される前にユーザーが認証されないことを意味します。したがって、まだ認証されていないため、ユーザーがログインしていることを確認できません。

6
Matthew Jones

Gromerには答えがありますが、このMSDNの記事を参照して詳細を確認することもできます。

http://msdn.Microsoft.com/en-us/library/ms998347.aspx

2
dtc

これがどれほど役立つかはわかりませんが、これは管理者ユーザーと一般ユーザーを区別するために使用する定型コードです。私には最適です。

ログインページで、おそらくonclickでユーザーオブジェクトを作成し、このコードでいくつかの関数を呼び出します(UserRoleはロールを持つEnumです)。

If admin Then 
            If role = UserRole.Admin Then
                RedirectFromLoginPage(username & "|" & userid, False)
                Return True
            Else
                Return False
            End If
        Else
            If String.IsNullOrEmpty(Current.Request.QueryString("ReturnUrl")) Then
                SetAuthCookie(username & "|" & userid, True)
            Else
                RedirectFromLoginPage(username & "|" & userid, True)
            End If
            Return True
        End If

Web.configで:

<location path="admin">
    <system.web>
        <authorization>
            <allow roles="Admin"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>
.....
<system.web>
<authentication mode="Forms">
        <forms loginUrl="/registration/login.aspx" timeout="129600"/>
    </authentication>
    <authorization>
        <allow users="*"/>
    </authorization>
</system.web>

...そして本当に必要な場合は、Global.asaxページで:

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
    If Request.IsAuthenticated Then
''
'get your roles for the current user'
''
 Dim userRoles() As String = Split(roles, "|")
        'Add the roles to the User Principal'
        HttpContext.Current.User = New GenericPrincipal(User.Identity, userRoles)
    End If
End Sub
1
Jason