メンバーシッププロバイダーを機能させようとしています。
これまでのところ:
<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");
}
}
Response.Redirect("/admin/default.aspx");
を呼び出す前に、これをLogin1_Authenticate
に入れてください
FormsAuthentication.SetAuthCookie("username", true);
コードと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イベントを「ユーザーを認証するために呼び出される」と説明します。これは、イベントが呼び出される前にユーザーが認証されないことを意味します。したがって、まだ認証されていないため、ユーザーがログインしていることを確認できません。
Gromerには答えがありますが、このMSDNの記事を参照して詳細を確認することもできます。
これがどれほど役立つかはわかりませんが、これは管理者ユーザーと一般ユーザーを区別するために使用する定型コードです。私には最適です。
ログインページで、おそらく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