このプロセスに関するドキュメントは非常に曖昧でわかりにくい(または古い)ため、手順を欠かさずに正しく実行していることを確認したかったのです。
ブラウザを閉じると有効期限が切れる安全なログインシステムを作成しようとしています。
-私のweb.configには次のものがあります-
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" defaultUrl="Index.aspx" name=".ASPXFORMSAUTH" timeout="100" />
</authentication>
<authorization>
<allow users="?" />
</authorization>
<machineKey decryption="AES" validation="SHA1" validationKey.......... />
だから私はユーザー名/パスワードのテキストボックスとこのボタンでログインフォームを持っています:
<asp:Button ID="LoginButton" runat="Server" OnClick="Login_Authenticate" Text="Sign in" />
Login_Authenticateの内部では、次のことを行います。
protected void Login_Authenticate(object sender, EventArgs e){
string userName = UserName.Text;
string password = Password.Text;
bool Authenticated = false;
// Here's code that makes sure that Username and Password is CORRECT
if(AuthClass.Authenticate(userName, password)){
Authenticated = true;
}
// error checking does happen here.
if (Authenticated)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30), rememberUserName, String.Empty, FormsAuthentication.FormsCookiePath);
string encryptedCookie = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookie);
cookie.Expires = DateTime.Now.AddMinutes(30);
Response.Cookies.Add(cookie);
//FormsAuthentication.RedirectFromLoginPage(userName, false);
Response.Redirect("MainPage.aspx");
}
}
--- MasterPage.master.csでPage_Init()に次のチェックがあります---
if (Context.User.Identity.IsAuthenticated)
{
int userid = (int)Session["userid"];
if (userid == null)
{
userid = GetUserID(Context.User.Identity.Name);
if (userid != null)
{
Session["userid"] = userid;
}
}
}
編集:--- GLOBAL.ASAX;私がよく知らないコードが正しいか、それが何をするかを知っている
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
// look if any security information exists for this request
if (HttpContext.Current.User != null)
{
// see if this user is authenticated, any authenticated cookie (ticket) exists for this user
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
// see if the authentication is done using FormsAuthentication
if (HttpContext.Current.User.Identity is FormsIdentity)
{
// Get the roles stored for this request from the ticket
// get the identity of the user
FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
//Get the form authentication ticket of the user
FormsAuthenticationTicket ticket = identity.Ticket;
//Get the roles stored as UserData into ticket
string[] roles = { };
//Create general prrincipal and assign it to current request
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles);
}
}
}
}
---それ以降、すべてのページで、セッションユーザーIDを使用してユーザー情報とコンテンツを収集し、ユーザーに適切な認証とグループロールのアクセス許可があることを確認します。
これはすべて正しいですか?または、どこかで復号化する必要がありますか?
これは安全なユーザーログインを行うのに十分ですか?または、フォーム認証に煩わされず、独自のCookieを作成してそれを自分で管理する独自の方法を見つけるべきではありませんか?
コードの記述方法は、ブラウザセッション全体でログインが保持されます。何が起こっているかの基本を理解するのに役立つかもしれません。
Cookieベースの認証方法の場合、実際には3つのアクションがあります。
1)ログイン-ユーザーの資格情報を検証し、ブラウザでCookieを作成して保存します。
2)ログアウト-ブラウザからCookieを削除します(Cookieを期限切れにするか削除する)
3)要求ごとの検証(Application_AuthenticateRequestである部分)-Cookieが存在するかどうかを確認し、存在する場合は、ユーザーのIDとロールを取得し、HttpContext.Current.Userを設定します。
通常、FormsAuthenticationモジュールは、このほとんどをユーザーから隠します。コードがFormAuthenticationの一部の要素(FormsAuthenticationTicketやFormsIdentityなど)を使用しようとしているようです。これは、必要なものが得られれば問題ありません。
Login_Authenticateメソッドは、Cookieに有効期限を設定している場合を除き、正常に見えます。これにより、ブラウザを閉じて再度開いた場合でも、Cookieが保持されます。これは望みの動作ではないため、Cookieの有効期限を設定しません。これを設定することは、「remember me」チェックボックスをチェックするようなものです。
Application_AuthenticateRequestのコードは、アプリケーションからページが提供されるたびに実行されます。主な仕事は、HttpContext.Current.Userを設定することです。通常、ユーザーがログインしていない場合、Userはnullまたは匿名ユーザーです。ユーザーがログインしている場合、これはユーザーを表している必要があります。
これらの3つのことを実行している場合、コードの任意の場所でHttpContext.Current.Userを参照して、表示する情報のレベルを決定できます。たとえば、ページを管理者のみに制限する場合、HttpContext.Current.Users.IsInRole( "Administrators")を呼び出し、呼び出しがfalseを返した場合にページからリダイレクトすることができます。
お役に立てれば。
私は主題に少し遅れていますが、物事をシンプルに保ちながらフォーム認証を実装しようとしている人のために(しようとしていたように)、ここでmsdnで見つけた関連する最新のドキュメント: http:// msdn .Microsoft.com/en-us/library/xdt4thhy(v = vs.100).aspx
要するに、クッキーの設定、チェック、チケットまたはプリンシパルのインスタンス化を台無しにしないでください... FormsAuthentication
クラスに任せます。
ログオン時に、コードに認証情報があり、有効な場合は、呼び出します
FormsAuthentication.RedirectFromLoginPage(yourUserId, false);
認証Cookieは設定されますが、リダイレクトと組み合わせれば十分です。 「false
」は、認証を保持しないためのものです。ブラウザを閉じると(または認証タイムアウト)失われます。
すでに認証された要求では、認証が有効であることを確認するためにコードで確認するものは何もありません。使用する Context.User.Identity.Name
誰が接続されているかを確認します(上記の文字列yourUserId
になります)。
明示的なログアウト時に、呼び出します
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
また、web.configでフォーム認証を構成します。
<system.web>
<authentication mode="Forms">
<forms loginUrl="yourLoginPage" defaultUrl="yourDefaultPageAfterLogin">
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
MVCアプリケーションの場合、承認部分を構成から削除し、AuthorizeAttribute
をグローバルフィルター属性として登録し、それを必要とするコントローラーまたはアクションでAllowAnonymousAttribute
を使用して処理する必要があります。 (MVC4。この前に、それを処理するために独自の属性を作成する必要がありました。)
認証タグに問題があります:
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
匿名ユーザーを拒否するためです。これを修正すれば、マスターページとglobal.asaxからすべてのものを安全に削除できます。フォームアイデンティティをセッションに保存された独自のカスタムアイデンティティに再マップする必要はありません。リソースの浪費であり、ソリューションのセキュリティが大幅に向上するとは思いません。フォームCookieを使用できます。
Remember Meの完全なワークフローには以下が必要です。1.カスタムデータをCookieに書き込みます。 2.そのカスタムデータを読み取ります。
Cookieを介してリクエストを認証できる場合でも、HttpSessionオブジェクトがそのリクエストに対して再開可能であることを意味しません。