0

現在、ユーザーがパスワードを変更できる単純なログインアプリケーションを実行しています。ただし、@Html.ActionLinkパスワードの変更ページにリダイレクトされません。web.config の設定が原因だと思います。どうすれば修正できますか?

これが私のコードです。

Index.chtml (ログインページ)

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">   </script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<h2>@ViewBag.Title</h2>

@using(Html.BeginForm())
{
    @Html.LabelFor(login => login.Username) 
    @Html.TextBoxFor(login => login.Username)<br/>
    @Html.LabelFor(login => login.Password) 
    @Html.PasswordFor(login => login.Password)<br/>
    <input type="submit" value="Login" />
    @Html.ActionLink("Change Password", "Index", "ChangePW")
    @Html.ValidationSummary()
}
@ViewBag.Error

Web.config

  <location>
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
  </location>

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <location path="Scripts">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

をクリックした後の結果の HTML コードChange Password:

<div>
  <h2>BlueBerry Login</h2>

  <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
  <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
  <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript">    </script>
  <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
  <h2></h2>

  <form action="/Login?ReturnUrl=%2fChangePW" method="post">
    <label for="Username">User name: </label>
    <input data-val="true" data-val-required="The User name:  field is required."   id="Username" name="Username" type="text" value="" />
    <br/>
    <label for="Password">Password: </label>
    <input data-val="true" data-val-required="The Password:  field is required." id="Password" name="Password" type="password" />
    <br/>
    <input type="submit" value="Login" />
    <a href="/ChangePW">Change Password</a>
    <div class="validation-summary-valid" data-valmsg-summary="true">
    <ul>
      <li style="display:none"></li>
    </ul>
    </div>
  </form>
</div>

更新@Html.ActionLinkアプリケーションに入ったときに を 使用してみましたが、うまくいきました。それは本当に奇妙です...

更新 2

ログインコントローラーのコードは次のとおりです

public class LoginController : Controller
{
    //
    // GET: /Login/
    #region Declarations

    MembershipHelper _mem = new MembershipHelper();
    #endregion

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(MasterUser user)
    {
        if (ModelState.IsValid)
        {
            if (_mem.ValidateUser(user.Username, user.Password)) //successful
            {
                FormsAuthentication.SetAuthCookie(user.Username, false);
                user = _mem.LoggedUser;
                Session["loggedUser"] = user;
                return RedirectToAction("Index", "Home");

            }
            ModelState.AddModelError("",_mem.Status);
        }
        else
        {
            ModelState.AddModelError("", "User does not exist");
        }
        return View();
    }        
}
4

1 に答える 1

0

間違った答え、以下を参照してください

web.configで、これは次のとおりです。

<location>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

ログインしたユーザーのみがアプリ/サイトのすべてのURLにアクセスできるようにします。これを追加する

<location path="ChangePW">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
</location>

パスワードの変更ページを前のルールから除外し、ログインしなくてもアクセスできるようにします。

この後、安全に元に戻すことができ、@HtmlActionLink現在意図したとおりに機能します。


編集

どうやら、MVCルーティングはweb.configの認証関連のものではまったく機能しません。そのリンクの回答で説明されている[Authorize]ように、ログインの背後で制限したいすべてのコントローラーアクションに追加するだけです。もちろん、web.config内のすべてのユーザーを拒否する承認セクションを削除する必要があります。

それほど面倒ではない方法は、ChangePasswordアクションを新しいコントローラーに移動することです。その後、すべてのユーザーに新しいコントローラーの許可を与えることで、web.configで認証を使用できます。

于 2012-11-14T07:20:29.950 に答える