如何覆盖某些网页的身份验证…

本文关键字:网页 身份验证 何覆盖 覆盖 | 更新日期: 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所示