0

同僚から MVC 3 Razorview プロジェクトを引き継ぎました。パスワードを忘れた場合のページを作成しましたが、ログオン ページでパスワードを忘れた場合のリンクをクリックすると、Web サイトはユーザーにログインを要求します。いくつかのグーグル検索を行い、属性を使用してホワイト リスト アクションのソリューションを実装しました。[AllowAnonymous]ただし、これで問題は解決しませんでした。

コードをステップ実行すると、パスワードを忘れたアクションが呼び出されることはありません。Account Controller の LogOn アクションに直接プッシュされます。には_ViewStart.cshtml次のコードがあり、忘れたパスワードのレイアウトがそれを使用せず、コードにレイアウトが設定されていても呼び出されます。

@{
    Layout = Request.IsAuthenticated ? "~/Views/Shared/_Layout.cshtml" : null;
}
4

2 に答える 2

5

ビューで使用されるコントローラーのすべてのアクション メソッドをホワイト リストに含める必要があります ([AllowAnonymous] を使用)。RecoverPassword ページで同じ問題が発生し、ホワイト リストにないメニュー メソッドがレイアウトで呼び出されていることに気付きました。

于 2012-11-12T18:04:10.040 に答える
2

これを試すことができます。http://blog.tomasjansson.com/2011/08/securing-your-asp-net-mvc-3-application/

アップデート

次のコードは正常に動作します。基本クラス自体に OnAuthorization を実装します。

public class MyBaseController : Controller
{
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) ||
                            filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                                typeof(AllowAnonymousAttribute), true);
        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
            if (!User.Identity.IsAuthenticated)//Implement your own logic here
            {
                var url = new UrlHelper(filterContext.RequestContext);
                var logonUrl = url.Action("LogOn", "Home", new { reason = "NotAuthorized" });
                filterContext.Result = new RedirectResult(logonUrl);

            }
        }

    }
}

public class HomeController : MyBaseController 
{

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

    [AllowAnonymous]
    public ActionResult PasswordReset()
    {
        return Content("reset your password");
    }

    [AllowAnonymous]
    public ActionResult LogOn(string reason)
    {
        return Content("please log in");
    }
}

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class AllowAnonymousAttribute : Attribute
{
}
于 2012-08-07T03:34:27.037 に答える