- 締切済み
ASP.NET2.0で、パスワード不一致の検出
まだ、勉強始めたばかりの者です。 Login_LoginError()で、パスワードの不一致を検出するのは、どうすればいいのですか?MembershipUserのGetPasswordメゾッドは、使えませんと出てしまいました。初歩的な質問だと思いますが、宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
失礼しました。質問の趣旨を勘違いしてました。 (入力したパスワードの取得方法だと思っていました) さて、間違ったパスワードを取得する方法はありますが、そのユーザの正しいパスワードを取得するには、いろいろと面倒なことをやらなければなりません。理由は、ログインしていないユーザのパスワードを取得するということは、セキュリティホールにもなりかねませんので簡単にパスワードを取得できないようメンバープロバイダが構成されているからです。 正しいパスワードと間違ったパスワードのマッチングという発想自体が間違っているということを念頭においてください。 何らかの理由でログインできなかったということは、それ以上のことはしてはならないということをご理解頂いた上で、それでもどうしても正しいパスワードを取得したいというのであれば、やり方を公開します。 ASP.NETとMember Providerの概念をしっかり抑えないと初心者の方には厳しいかもしれませんが、一応、掲載しておきます。 ・認証カスタムプロバイダを独自で作るか、 Web.configファイル内のmembershipの定義を修正または追加します。 (既に定義がある場合は修正) 下記は、Web.configで定義した場合の例 <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="認証情報が格納されているDB接続文字列名" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" /> </providers> </membership> ここでポイントになるのは、「enablePasswordRetrieval」がtrueになっているか?というところです。 「enablePasswordRetrieval」は、パスワードを忘れた際、キーワード(「パスワードを忘れた時の秘密の答え」みたいなものです)を与えることで、正しいパスワードを 取得できるというものです。 もしキーワード「秘密の答え」を全ユーザに統一しているのであれば、 C#の場合 protected void Login_Error(object sender, EventArgs e) { // 対象のログインコントロールの取得 Login login = ((Login)sender); // 入力したパスワードの取得 string password = login.Password; // 本当のパスワードを取得 string truePassword = Membership.Provider.GetPassword(login.UserName, "秘密の答えとなる文字列"); // 入力パスワードと本当のパスワードをマッチング if (password != truePassword) { this.Label1.Text = "設定したパスワードと異なります"; } } VBの場合 Protected Sub Login_Error(object sender, EventArgs e) ' 対象のログインコントロールの取得 Dim login As Login = CType(sender, Login) ' 入力したパスワードの取得 Dim password As String = login.Password ' 本当のパスワードを取得 Dim truePassword As String = Membership.Provider.GetPassword(login.UserName, "秘密の答えとなる文字列") ' 入力パスワードと本当のパスワードをマッチング If password <> truePassword Then Me.Label1.Text = "設定したパスワードと異なります" End If End Sub なお、この上記の手法を使ってパスワードを取得するには、 passwordFormat="Encrypted"となっている必要があり、 passwordFormat="Hash"となっている(ハッシュで暗号化されている) パスワードは取得することはできませんので注意して下さい。 (ただし、Hashにしておかないとセキュリティレベルはかなり下がります) いかがでしょうか?ここまでして、ログインできなかったユーザに対し、 正しいパスワードを取得しなければならない理由はありますか? もう一度、貴方がやろうとしていることが、セキュリティに危険を 冒していることだという認識を持っていただきたいと思います。 (たとえ、ASP.NETの初心者であっても、それぐらいはわかるはずです。) 参考になれば幸いです。
すいません、VBの時のコードが間違っているので訂正します。 VBの場合 Protected Sub Login_Error(ByVal sender As Object, ByVal e As EventArgs) ' LoginViewコントロールの中からLoginコントロールを取得する Dim login As Login = CType(LoginView1.FindControl("Login1"), Login) ' Loginコントロールの中からパスワードコントロールを取得する Dim password As TextBox = CType(login.FindControl("Password"), TextBox) ' ログインに失敗したパスワードを取得し、ラベル(画面)に表示 Me.Label1.Text = password.Text End Sub
ログインに失敗した時のパスワードが取りたいってことですね。 >MembershipUserのGetPassword これは、ログインが成功しないと取得できないので おっしゃられている通り使えないですね。 ちなみにASP.NETで使われている言語は、C#ですか?VBですか? 今後、質問する時はC#かVBかも添えて頂けると助かるのですが、 明記がないので、一応、両方掲載しておきます。 例えば、ログインコントロールをLogin.aspxにこのように配置した場合 <form id="form1" runat="server"> <div> <asp:LoginView ID="LoginView1" runat="server"> <AnonymousTemplate> <asp:Login ID="Login1" runat="server" OnLoginError="Login_Error"> </asp:Login> </AnonymousTemplate> </asp:LoginView> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> </form> ログインに失敗したパスワードを取得するには、下記の方法で取得します C#の場合 protected void Login_Error(object sender, EventArgs e) { // LoginViewコントロールの中からLoginコントロールを取得する Login login = LoginView1.FindControl("Login1") as Login; // Loginコントロールの中からパスワードコントロールを取得する TextBox password = login.FindControl("Password") as TextBox; // ログインに失敗したパスワードを取得し、ラベル(画面)に表示 this.Label1.Text = password.Text; } VBの場合 Protected Sub Login_Error(ByVal sender As Object, ByVal e As EventArgs) // LoginViewコントロールの中からLoginコントロールを取得する Dim login As Login = CType(LoginView1.FindControl("Login1"), Login) // Loginコントロールの中からパスワードコントロールを取得する Dim password As TextBox = CType(login.FindControl("Password"), TextBox) // ログインに失敗したパスワードを取得し、ラベル(画面)に表示 Me.Label1.Text = password.Text; End Sub またわからなかったら聞いてください。
補足
早速の御回答有り難う御座います。 本当に始めたばかりなので、一歩進むと何日も躓いています。 丁寧に丁寧に解説頂き有り難う御座います。 基本的に考え方が間違っていたことが判りました。だた、折角、お手を煩わせて頂いているので、教えて頂いた点についてもじっくりと、勉強していこうと思います。 これから、解読になりますので、取りあえずは、補足内容の欄にてお礼を述べさせて頂きます。 私は、主に、Excel VBAで、小物を作っている程度で、ここ1年ぐらいで、VB2005に手を出し、SQLサーバーとかをちょっとかじった程度です。 ASPに触った時は、凄く便利だと思いましたが、パーツの癖と、概念的なものが理解できていないので、なかなか?進みません。(ホームページの製作の経験もありません。Excelで、インターネットエクスプローラーを操作して、Accessにデータを保存は、やったことがあるので、正規表現とかは、多少判ります。) でも、絶対にものにしたいと思っていますので、今後とも宜しくお願い致します。本当に、有り難う御座いました。