如何覆盖某些网页的身份验证…
本文关键字:网页 身份验证 何覆盖 覆盖 | 更新日期: 2023-09-27 17:54:36
我在主页上写了以下代码:-
<authentication mode="Forms">
<forms loginUrl="Loginpage.aspx" />
</authentication>
现在它将重定向到"Loginpage"。
如果我想在几个页面上重写此身份验证怎么办?另外请注意,在设计时页面数量和页面名称不可用,因此不能在配置文件中包含aspx页面名称。
是否有办法覆盖几个aspx页面的身份验证?
anil
Henrik的回答是一个很好的答案,如果执行得当应该会起作用。但是,这是从配置的角度解决问题的另一种选择。我知道你提到过你不会提前知道页面名称,所以你不能在web中包含一个条目。配置每个页面,但web。配置也允许你保护文件夹。例如,您可以将所有需要身份验证的页面放在名为"AuthRequired"的文件夹中,而将所有不需要身份验证的页面放在名为"Anonymous"的文件夹中。然后在你的web配置中,你可以有以下条目:
<location path="AuthRequired">
<system.web>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="Anonymous">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
您可以监听AuthorizeRequest事件并采取相应的行动。创建你自己的Http模块来完成这个任务。
三个选项:
-
使用上面的配置设置并生成带有web的文件夹。配置条目。
-
监听事件AuthenticateRequest,代码看起来像这样:
public class UserAuthenticationModule : IHttpModule { private HttpApplication _Context; private RoleManagerModule _RoleManager; public void Init(HttpApplication context) { _Context = context; context.AuthenticateRequest += AuthenticateUser; _RoleManager = (RoleManagerModule)context.Modules["RoleManager"]; _RoleManager.GetRoles += roleManager_GetRoles; } // http://stackoverflow.com/questions/1727960/how-to-keep-roleprovider-from-overriding-custom-roles private void roleManager_GetRoles(object sender, RoleManagerEventArgs e) { if (_Context.User is UserPrincipal) e.RolesPopulated = true; // allows roles set in AuthenticateUser to stick. } private static void AuthenticateUser(object sender, EventArgs e) { var app = (HttpApplication) sender; if (app.Context == null) return; var user = app.Context.User; // not signed in, forms authentication module takes care of redirecting etc. if (user == null) return; // we're done then. if (user is IUser) return; var userEntity = IoC.Resolve<IUserRepository>().FindByUserName(user.Identity.Name); // we can't find the user in the database. if (userEntity == null) throw new ApplicationException(string.Format("User '"{0}'" deleted from, or renamed in, database while logged into application.", user.Identity.Name)); // signed in, assigning user, which should assign Thread.CurrentPrincipal as well (it wouldn't do this on PostAuthenticateRequest). app.Context.User = new UserPrincipal(userEntity); userEntity.SetAuthenticated(); } //Implement IDisposable. public void Dispose() { } }
如果你的UserPrincipal实现了IPrincipal,那么IsInRole被用来给你的页面提供基于角色的访问。
- 服务导向;设置一个小型透明代理服务器。在动态存储中列出端点/uri,就像您所描述的那样。建立Rhino Security等授权服务;将其服务接口公开为REST-API或请求/应答接口等。假设从web应用程序的角度来看,每个请求都是允许的,并注意重定向的位置。在代理服务器中,例如nginx,它是Linux上一个非常好的基于c的异步代理服务器,从过滤器/模块调用授权服务。"深度安全",你可以在授权服务中共享安全配置。
你遵循的原则是,如果在web应用程序中不允许某些事情,你在AuthorizeRequest事件中执行throw new HttpException(405, "The current operation you are trying to perform is now allowed for your role or user or chosen path in life")
。注意,这里有一个AuthenticateRequest和另一个AuthorizeRequest事件
您通常应该有一个点,用户可以通过验证 -确认他们是他们声称的那个人。接下来,您可能正在谈论授权,这是允许/拒绝向用户执行某些操作的问题,例如发送GET请求。简单场景下的授权规则可以通过web配置。配置通过location元素,如Tom所示