- PR -

他の人のパスワードを変更したい

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2007/08/21
投稿数: 48
投稿日時: 2007-08-25 18:53
いつもお世話になっています。
VS2005でWEBサイトを作っています。

Login周りの質問です。
ChangePasswordコントロールでは自分のパスワードを変更したり回復したりできますが、他の人のパスワードを変更するためにはどうしたら良いのでしょうか?
PasswordRecoveryの回復用暗証コードも忘れた利用者のために特権ユーザを用意して、回復(初期化、もしくは仮のパスワードを設定)してあげる運用を想定しています。
MSDNも探してみましたが見つける事ができませんでした。
よろしくお願いします。
未記入
常連さん
会議室デビュー日: 2007/08/21
投稿数: 48
投稿日時: 2007-08-27 13:05
WEBサイトを運用する時に特権ユーザーが一般利用者のパスワードを変更(リセット、初期化、設定等)することはよくあることだと思うのですが、レスがまったくつかないのは聞き方がいけないのでしょうか?

それとも何か大きな勘違いをした質問なのでしょうか?

実際、自分で設定したパスワードを忘れてしまい、初期化したいのですが、メールアドレスの設定もいい加減になやってしまった都合でPasswordRecoveryもできず困っています。
今は開発中なので作り直せば良いだけなのですが、運用開始後はとても困ると思うのです。

よろしくお願いします。
プレマニア
常連さん
会議室デビュー日: 2007/08/24
投稿数: 34
投稿日時: 2007-08-27 15:46
こんにちは未記入様。

現在利用をお考えのログインコントロールはASP.NETメンバーシップを
使ったものですよね。

http://msdn2.microsoft.com/ja-jp/library/yh26yfzy(VS.80).aspx
こちらを読むとあらかじめ用意されている便利なコントロールたちは
認証できること(「パスワード」か「ヒントの答え」がわかっていること)を
前提としているようですね。従って、認証できないユーザを回復する機能は
自分で実装する必要があるのではないでしょうか。

そう考えて見ていくと「MembershipUser」クラスのメソッドを使って
実現できそうです。
http://msdn2.microsoft.com/ja-jp/library/system.web.security.membershipuser_members.aspx

よかったら検討してみてください。
BackDoor
ぬし
会議室デビュー日: 2006/02/20
投稿数: 831
投稿日時: 2007-08-27 16:11
こんにちは。
ここは専門外なんであまり見ていません。

引用:

未記入さんの書き込み (2007-08-27 13:05) より:

実際、自分で設定したパスワードを忘れてしまい、初期化したいのですが、メールアドレスの設定もいい加減になやってしまった都合でPasswordRecoveryもできず困っています。
今は開発中なので作り直せば良いだけなのですが、運用開始後はとても困ると思うのです。


別に困るようなことじゃない気がしますが?
基本的には開発時と同様にユーザアカウントの作り直しでよいと思いますよ。
# サイトの説明に「パスワード忘れはユーザアカウントの作り直しで対応」と
# 明記する必要はあると思いますけど。
# 運用上の重要なポイントはパスワード忘れの申請があった場合の本人確認を
# どうするかですね。
未記入
常連さん
会議室デビュー日: 2007/08/21
投稿数: 48
投稿日時: 2007-08-28 12:03
引用:

プレマニアさんの書き込み (2007-08-27 15:46) より:
こんにちは未記入様。

現在利用をお考えのログインコントロールはASP.NETメンバーシップを
使ったものですよね。

http://msdn2.microsoft.com/ja-jp/library/yh26yfzy(VS.80).aspx
こちらを読むとあらかじめ用意されている便利なコントロールたちは
認証できること(「パスワード」か「ヒントの答え」がわかっていること)を
前提としているようですね。従って、認証できないユーザを回復する機能は
自分で実装する必要があるのではないでしょうか。

そう考えて見ていくと「MembershipUser」クラスのメソッドを使って
実現できそうです。
http://msdn2.microsoft.com/ja-jp/library/system.web.security.membershipuser_members.aspx

よかったら検討してみてください。



MembershipUser.GetPassword()

回答ありがとうございます。
MSDNを頼りに自分で実装しようと思いいろいろ試しているのですが、上手くいきません。

作成したソースはこれです
------------ここから-----------------
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim usr As MembershipUser
Dim username As String = "user02"

Label1.Text = username
usr = Membership.GetUser(username, False)
If usr Is Nothing Then
Msg.Text = "Username " & Server.HtmlEncode(username) & " not found. Please check the value and re-enter."
Return
End If
Label1.Text = usr.UserName

Try
lblPassword.Text = usr.GetPassword()
Catch ex As Exception
Msg.Text = ex.Message
Return
End Try

End Sub
------------ここまで-----------------

最初にweb.configをデフォルトのまま実行したところ、GetPasswordのところで
「このメンバシップ プロバイダはパスワードの取得をサポートするように構成されていません。 」
となってしまいました。
それで、web.configに次の設定を追加しWebアプリケーション管理のセキュリティでユーザーを追加しようとしたところ登録に失敗しました。

GetPasswordができるようにするためにはどのように設定したら良いのでしょうか?

------------web.config 追加分 ここから-----------------
<membership defaultProvider="AspNetSqlMembershipProvider" userIsOnlineTimeWindow="15" hashAlgorithmType="">
<providers>
<clear />
<add connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Encrypted"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

</providers>
</membership>
(ここまで)
<roleManager enabled="true"/>
------------ここまで-----------------


------------登録失敗時のメッセージ ここから-----------------
エラーが発生しました。前のページに戻って、もう一度やり直してください。

次のメッセージは問題を診断するのに役立つ可能性があります: 呼び出しのターゲットが例外をスローしました。 場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 場所 System.Web.Administration.WebAdminMembershipProvider.CallWebAdminMembershipProviderHelperMethodOutParams(String methodName, Object[] parameters, Type[] paramTypes) 場所 System.Web.Administration.WebAdminMembershipProvider.CreateUser(String username, String password, String email, String passwordQuestion, String passwordAnswer, Boolean isApproved, Object providerUserKey, MembershipCreateStatus& status) 場所 System.Web.UI.WebControls.CreateUserWizard.AttemptCreateUser() 場所 System.Web.UI.WebControls.CreateUserWizard.OnNextButtonClick(WizardNavigationEventArgs e) 場所 System.Web.UI.WebControls.Wizard.OnBubbleEvent(Object source, EventArgs e) 場所 System.Web.UI.WebControls.CreateUserWizard.OnBubbleEvent(Object source, EventArgs e) 場所 System.Web.UI.WebControls.Wizard.WizardChildTable.OnBubbleEvent(Object source, EventArgs args) 場所 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) 場所 System.Web.UI.WebControls.Button.OnCommand(CommandEventArgs e) 場所 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 場所 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 場所 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 場所 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
------------ここまで-----------------

よろしくお願いします
プレマニア
常連さん
会議室デビュー日: 2007/08/24
投稿数: 34
投稿日時: 2007-08-28 12:34
なるほど。残念ながら今は環境がないので確認しながらご返答できないのですが、
MembershipUser.GetPassword メソッド ()の解説部分はご覧になりましたか?

こことWeb.configに追加された設定情報を見比べてみてください。

それより気になったのですが、このアプリケーションではユーザが正しいユーザIDを
入力しさえすればパスワードを画面に表示することになるのでしょうか。

管理者の画面に「ResetPassword」と「UnlockUser」を実装してユーザIDを
回復させてあげるような運用をお考えなのかと思っていましたが。

引用:

未記入さんの書き込み (2007-08-27 13:05) より:
WEBサイトを運用する時に特権ユーザーが一般利用者のパスワードを変更(リセット、初期化、設定等)することはよくあることだと思うのですが、レスがまったくつかないのは聞き方がいけないのでしょうか?

それとも何か大きな勘違いをした質問なのでしょうか?

実際、自分で設定したパスワードを忘れてしまい、初期化したいのですが、メールアドレスの設定もいい加減になやってしまった都合でPasswordRecoveryもできず困っています。
今は開発中なので作り直せば良いだけなのですが、運用開始後はとても困ると思うのです。

よろしくお願いします。

未記入
常連さん
会議室デビュー日: 2007/08/21
投稿数: 48
投稿日時: 2007-08-28 13:02
引用:

MembershipUser.GetPassword メソッド ()の解説部分はご覧になりましたか?

こことWeb.configに追加された設定情報を見比べてみてください。



すみません。
enablePasswordRetrievalがfalseのままでした。
trueに直します。
ただ、ユーザーの登録ができないので確認ができないのですが・・・


引用:

それより気になったのですが、このアプリケーションではユーザが正しいユーザIDを
入力しさえすればパスワードを画面に表示することになるのでしょうか。

管理者の画面に「ResetPassword」と「UnlockUser」を実装してユーザIDを
回復させてあげるような運用をお考えなのかと思っていましたが。




利用者にはPasswordRecoveryやResetPasswordしか提供しません。
ResetPasswordは悪意の第三者が勝手に実行しないよう対策が必要だと思いますが、これは次の段階のこととして今は考えていません。
今やろうとしているのは、私がやってしまったように、セキュリティの質問を忘れてしまい、かつ、返信用のメールアドレスが間違っているために自分ではパスワードの初期化もできない人を救うためにアドミニストレーターが最終手段としてパスワードを初期化、もしくは再設定するための機能です。
本人確認は事前に書類等で行うことになると思いますがそれは運用上の問題なのでシステムとは切り離して考えています。

よろしくお願いします。
プレマニア
常連さん
会議室デビュー日: 2007/08/24
投稿数: 34
投稿日時: 2007-08-28 18:59
引用:

未記入さんの書き込み (2007-08-28 13:02) より:
利用者にはPasswordRecoveryやResetPasswordしか提供しません。
ResetPasswordは悪意の第三者が勝手に実行しないよう対策が必要だと思いますが、これは次の段階のこととして今は考えていません。
今やろうとしているのは、私がやってしまったように、セキュリティの質問を忘れてしまい、かつ、返信用のメールアドレスが間違っているために自分ではパスワードの初期化もできない人を救うためにアドミニストレーターが最終手段としてパスワードを初期化、もしくは再設定するための機能です。
本人確認は事前に書類等で行うことになると思いますがそれは運用上の問題なのでシステムとは切り離して考えています。

よろしくお願いします。



なるほど。未記入さんの言葉で「利用者」のパスワード管理関係を整理すると
以下のようになるでしょうか。
1.利用者画面
 ・Loginクラスでログイン機能を実装
 ・ChangePasswordクラスでパスワード変更機能を実装
 ・PasswordRecoveryクラスでパスワードを回復またはリセット
2.アドミニストレータ画面
 ・MembershipUserクラスでユーザを回復またはパスワードをリセット

MembershipUserクラスの
MembershipUser.ResetPassword メソッド ()

MembershipUser.UnlockUser メソッド
を利用すれば管理者画面から強制的にパスワードをリセットすることが
可能になると思うのですが。
リセット後のパスワードをどのように知らせるのかは未記入さんの
おっしゃるとおり、運用上の問題ですね。

あくまでも「アドミニストレータが最終的な手段として行う再設定or初期化」
という考え方でのご提案です。

ところで登録に失敗した件については、現状では何とも判りかねます。
なにせ今のところ環境がないもので。

とりあえず、
追加したWeb.configの指定に合わないようなパラメータ指定をしてはいませんか?

スキルアップ/キャリアアップ(JOB@IT)