1

MVC3 Web サイトの管理セクションはエリアとして作成されます。次に、次のコードを Web.config に入れます。

<location path="Admin">
<system.web>
  <authentication mode="Forms">
    <forms loginUrl="~/Admin/Login/Login" timeout="5000" defaultUrl="~/Admin/Login/Redirect" />
  </authentication>
  <authorization>
    <deny users="?"/>
  </authorization>
</system.web>
</location>

ただし、エラーがスローされます

パーサー エラー メッセージ: アプリケーション レベルを超えて allowDefinition='MachineToApplication' として登録されたセクションを使用するのはエラーです。このエラーは、IIS で仮想ディレクトリがアプリケーションとして構成されていないことが原因である可能性があります。

ソース エラー:

Line 44:   <location path="Admin">
Line 45:     <system.web>
Line 46:       <authentication mode="Forms">
Line 47:         <forms loginUrl="~/Admin/Login/Login" timeout="5000" defaultUrl="~/Admin/Login/Redirect" />
Line 48:       </authentication>
4

3 に答える 3

0

私は説明しようとしました

アプリケーションに複数の領域が含まれている場合、アプリケーションの実行時にすべての領域が登録されます。ログインユーザーがすべてのエリアにアクセスできるようにします。

ただし、特定のエリアのみアクセスを許可する場合は、デフォルトのエリア登録プロセスをオーバーライドする必要があります。

その過程で、すべてのルートが各エリアに属していることを削除しました

while (RouteTable.Routes.Count > 0) RouteTable.Routes.RemoveAt(0);

その後、ユーザーのログインを許可したいエリアのみを許可します。

MvcApplication app = (MvcApplication)HttpContext.ApplicationInstance;
RouteCollection existingcoll = outeCollection)app.Application["ExistingRoutecolling"];

foreach (Route _route in existingcoll)
 {
    // allow only those routes , which belongs to the area which you want allow to access the login user
    if (_route.Url == "Admin/{controller}/{action}/{id}")
        RouteTable.Routes.Add((RouteBase)_route);       
    // re-register routes again
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    // now redirect with expected action
    return RedirectToAction("controller", "action", new { area = "Admin" });
}
于 2016-06-26T02:57:16.970 に答える
0

<authentication>特定のサブフォルダーのノードをオーバーライドすることはできません。これは単にサポートされていません。エリアに別のログイン ページが必要な場合は、カスタム[Authorize]属性を記述して、エリア内のすべてのコントローラー アクションをそれで装飾できます。アイデアは、HandleUnauthorizedRequestメソッドのみをオーバーライドし、目的のログイン ページにリダイレクトすることです。

例えば:

public class AdminAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var routeValues = new RouteValueDictionary(new
        {
            controller = "login",
            action = "login",
            area = "admin"
        });
        filterContext.Result = new RedirectToRouteResult(routeValues);
    }
}

また、web.config に関する限り、ノードはセクション内ではなく<authentication>、セクションの直下に構成する必要があります。<system.web><location>

于 2013-03-13T07:27:16.307 に答える