ASP.NET中的位置访问

ASP.NET中的位置访问,asp.net,web-config,forms-authentication,role,Asp.net,Web Config,Forms Authentication,Role,我有我的网站的管理区:我想通过角色保护它(我使用的是ASP.NET forms auth),这样只有角色为“admin”的用户才能访问它。 在web.config中,我添加了以下条目: <location path="WebAdmin"> <system.web> <authorization> <deny users="*"/> <allow roles="admin"

我有我的网站的管理区:我想通过角色保护它(我使用的是ASP.NET forms auth),这样只有角色为“admin”的用户才能访问它。 在web.config中,我添加了以下条目:

<location path="WebAdmin">
    <system.web>
        <authorization>
            <deny users="*"/>
            <allow roles="admin"/>
        </authorization>
    </system.web>
</location>

而且它“有点”有效——如果你不是“管理员”,它会将你重定向到登录页面。但我不想这样,我想显示一个错误页面。我能控制这种行为吗

谢谢,,
Andrey

您可以通过web.config更改文件认为是登录页面的URL。(见附件。)

考虑在配置中用自定义错误页面url替换真实登录url

编辑:

如果将web.config方法作为一个通用解决方案在整个虚拟目录中实现,则该方法是可行的。(试图在web.config中的
元素下配置自定义loginUrl将导致配置错误。)

通过在您的管理页面(或管理页面的基类)中注入这样的代码,您可以强制对这种行为进行更细粒度的控制:


您还可以考虑创建一个
HttpModule
,或点击您的Global.asax,以更通用的方式处理授权,而不依赖页面继承。看见使用
BeginRequest
事件检查URL路径,如果它与您的模式匹配,则传递您想要传递的错误或重定向。

您可以通过web.config更改文件认为是登录页面的URL。(见附件。)

考虑在配置中用自定义错误页面url替换真实登录url

编辑:

如果将web.config方法作为一个通用解决方案在整个虚拟目录中实现,则该方法是可行的。(试图在web.config中的
元素下配置自定义loginUrl将导致配置错误。)

通过在您的管理页面(或管理页面的基类)中注入这样的代码,您可以强制对这种行为进行更细粒度的控制:


您还可以考虑创建一个
HttpModule
,或点击您的Global.asax,以更通用的方式处理授权,而不依赖页面继承。看见使用
BeginRequest
事件检查URL路径,如果它与您的模式匹配,则传递您想要传递的错误或重定向。

我的应用程序到处使用forms auth进行身份验证/授权,因此它需要知道真正登录页面的URL,因此,我无法更改web.config中的登录页面url…除非我误解了您的意思…@Andrey:当用户未通过身份验证时,重定向行为是由此web.config值驱动的。您仍然可以在页面上放置指向真实登录页面的超链接;这种方法只会愚弄重定向引擎将用户发送到您的错误页面。@Andrey:这不是一种坏方法,尽管有否决票。我以前使用过它,效果很好。好吧,也许我误解了你的建议-你是说我应该将web.config中的loginURL参数更改为我的错误页面?那么,当未经身份验证的用户试图访问需要身份验证的页面时,如何将其重定向到真正的登录页面?你能举个例子吗?也许是我误解了。我原以为您希望错误页面作为处理访问需要身份验证的页面的用户的通用解决方案。您只想在所描述的位置对经过身份验证的页面执行错误行为?我的应用程序正在各地使用forms auth进行身份验证/授权,因此它需要知道真实登录页面的url,因此,我无法更改web.config中的登录页面url…除非我误解了您的意思…@Andrey:当用户未通过身份验证时,重定向行为是由此web.config值驱动的。您仍然可以在页面上放置指向真实登录页面的超链接;这种方法只会愚弄重定向引擎将用户发送到您的错误页面。@Andrey:这不是一种坏方法,尽管有否决票。我以前使用过它,效果很好。好吧,也许我误解了你的建议-你是说我应该将web.config中的loginURL参数更改为我的错误页面?那么,当未经身份验证的用户试图访问需要身份验证的页面时,如何将其重定向到真正的登录页面?你能举个例子吗?也许是我误解了。我原以为您希望错误页面作为处理访问需要身份验证的页面的用户的通用解决方案。您希望仅对所述位置中经过身份验证的页面执行错误行为吗?
protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);

    if (!User.IsInRole("admin"))
    {
        Response.Redirect("~/ErrorPage.aspx?reason=denied");
    }
}