23

もう読んだ

MVC 3で認証されていない場合、簡単にリダイレクトする方法は? ユーザーが承認されていないが、回答からのリンク(http://wekeroad.com/2008/03/12/aspnet-mvc-securing-your-controller-actions/を意味します)が機能しない場合、AccessDeniedページにリダイレクトします 。

置いた

[Authorize(Users = "test")]
    public class RestrictedPageController: Controller
    {

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

 ....
    }

そして私のweb.configでは、私はすでに持っています

 <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
 </authentication>

それに応じてhttps://stackoverflow.com/a/6770583/998696

しかし、アクセスしたいときは/RestrictedPage/Index、(他のコントローラーから)他のページにリダイレクトする必要があります。これの代わりに、エラーは次のように表示されます。

Server Error in '/Project' Application.

The view 'LogOn' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Account/LogOn.aspx
~/Views/Account/LogOn.ascx
~/Views/Shared/LogOn.aspx
~/Views/Shared/LogOn.ascx
~/Views/Account/LogOn.cshtml
~/Views/Account/LogOn.vbhtml
~/Views/Shared/LogOn.cshtml
~/Views/Shared/LogOn.vbhtml

ログイン前はLogonページフォームは正常に表示されますが、ページにアクセスすると上記のエラーが表示され/RestrictedPage/Indexます。ページへのアクセスを許可された別のユーザーでログインできRestrictedPageます。

私の間違いはどこにあり、どのようにリダイレクトを設定しますか?

4

5 に答える 5

63

The default Authorize attribute behaves in such a way that when the user is not authenticated or authenticated but not authorized then it set the status code as 401 (UnAuthorized). When the filter sets the status code as 401 the ASP.NET framework checks if the website has forms authentication enabled and if it is then redirects to loginUrl parameter set up there.

If you want to change that behavior say you want to redirect the user to an AccessDenied controller if the user is authenticated but not authorized then you have to extend the Authorize attribute and override the HandleUnauthorizedRequest method.

For ex.

public class CustomAuthorize: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
        else
        {
           filterContext.Result = new RedirectToRouteResult(new 
               RouteValueDictionary(new { controller = "AccessDenied" }));
        }
    }
}

You can override the HandleUnauthorizedRequest as per your need and then you have to mark the controller actions to use the CustomAuthorize attribute instead of the built-in one.

于 2012-06-07T09:08:53.627 に答える
2

「~/Account/LogOn」の代わりに「/Account/LogOn」を配置します

于 2012-06-07T09:36:31.497 に答える
1

はい、web.configで述べたように正しいです

<forms loginUrl="~/Account/LogOn" timeout="2880" />

リダイレクトは、アカウント コントローラーとログオン アクション結果を探しています。ページをリダイレクトしたい場合は、アカウントとログオンの代わりにそこに変更してください

于 2012-06-07T08:41:01.573 に答える