0

我使用 ASP.NET SimpleMembership..

我的场景;

用户登录,然后我在 pages_Membership 表上将 IsConfirmed 列更改为 false .. 并且用户尝试更改页面,登录页面对用户来说似乎..

4

2 回答 2

1

您最明智的选择是使用 Global.asax.cs 中的任何与身份验证相关的步骤,或AuthorizeAttribute. 鉴于未经确认的用户将不得不去某个地方(例如为了确认他们的帐户),那么您可能不想要前者。无论采用哪种方法,他们的下一个请求都将被拒绝。

因此,我将扩展您的[Authorize]属性以执行以下操作,并在适当的控制器和操作中使用它而不是[Authorize]我假设 C#,因为您没有在标签中指定语言):

public class AuthorizeIfConfirmedAttribute : AuthorizeAttribute {
    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        if (!base.AuthorizeCore(httpContext)) return false;

        System.Security.Principal.IIdentity user = httpContext.User.Identity;
        return WebMatrix.WebData.WebSecurity.IsConfirmed(user.Name);
    }
}

[AuthorizeIfConfirmed]
public class MyController { ... }

(如果您想在您的UserProfile类上使用自定义属性而不是IsConfirmed那么您可以简单地相应地调整此代码)。

这种方法的优点是它将您的所有授权逻辑保留在通常的位置,您还可以将其与角色执行结合起来,例如:

[AuthorizeIfConfirmed(Roles = "admin")]
public class MyController { ... }

请注意,如果您使用 WebApi 或 SignalR,则可能必须包含这些检查,但是您也在为 api 执行请求授权。

于 2013-05-25T18:50:43.987 回答
0

我在 Global.asax 中使用 Application_AuthenticateRequest .. 因为我的应用程序需要在所有页面上进行身份验证..

protected void Application_AuthenticateRequest()
        {
            if (WebSecurity.IsAuthenticated)
            {
                bool isConfirmed = (..your codes here..)
                if (isConfirmed == false)
                {
                    WebSecurity.Logout();    
                } 
            }
        }
于 2013-05-27T07:11:16.480 回答