如何实现基于会话数据的ASP.NET MVC授权检查?(How to implement autho

2019-06-26 07:42发布

这将是我的第一个ASP.NET MVC应用程序与窗体身份验证,所以我想确保我不会错过任何东西。 该方案是这样的:公共/安全区域。

在私营领域它甚至进一步限制到特定区域/用户。 这些“区域”被定制到被每个用户组定制的基础区域限定。

因此,例如,用户可以得到URL /Area/Controller/Action 。 他们将需要有权限的安全区域,否则将被重定向到登录查看。

我一直在阅读有关的AuthorizeAttribute ,但我不知道如何/在哪里我应该做这些基本的检查。 我最初的预感将存储在会话的用户对象成功登录用户的IP和细节对他们有什么访问等后

对于每个安全控制器调用的授权检查将验证有效的用户对象在会话存在,IP地址仍然匹配,并且用户可以访问特定的区域。 有没有什么明显的漏洞来此设置?

编辑:在哪里/我如何实施这些检查,这样,当一个控制器被打上[授权]将执行这些会话对象的检查?

任何指针或建议,将不胜感激。 谢谢。

Answer 1:

那么它看起来像我有一个自定义AuthorizeAttribute去了。 它实际上是非常简单的。 下面是代码:

namespace MyApp.Custom.Security
{
    public class Secure : AuthorizeAttribute
    {
        /// <summary>
        /// Checks to see if the user is authenticated and has a valid session object
        /// </summary>        
        /// <param name="httpContext"></param>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null) throw new ArgumentNullException("httpContext");

            // Make sure the user is authenticated.
            if (httpContext.User.Identity.IsAuthenticated == false) return false;

            // This will check my session variable and a few other things.
            return Helpers.SecurityHelper.IsSignedIn();
        }
    }
}

然后在我的控制器我只是把一个[Secure]属性,它使用上述任何时候该控制器访问我的功能。 很简单。 我还做了一个[SecureByRole]属性以及做所有相同的东西,但会检查我的自定义角色的信息也是如此。 没有必要为所有建在巫术从罐头会员:)



Answer 2:

尝试一下RoleProvider类 。 这是ASP.net如何使用基于角色的授权用户的基本框架。 而且我认为你应该使用[授权(角色=“...”)]属性来利用这一点。



Answer 3:

在我以前的应用程序,我用一个简单的HTTP模块来增加额外的角色身份验证的用户等等(我这样做是因为我的要求是非常受限)。

public class AuthorisationModule : IHttpModule
{
    public void Init( HttpApplication context )
    {
        context.AuthorizeRequest += AuthorizeRequest;
    }

    private void AuthorizeRequest(object sender, EventArgs e)
    {
        var currentUser = HttpContext.Current.User;
        if( !currentUser.IsAuthenticated() )
        {
            return;
        }

        var roles = new List<string>();
        // Add roles here using whatever logic is required

        var principal = new GenericPrincipal( currentUser.Identity, roles.ToArray() );
        HttpContext.Current.User = principal;
    }

    public void Dispose()
    {
        if(HttpContext.Current == null )
        {
            return;
        }

        if(HttpContext.Current.ApplicationInstance == null)
        {
            return;
        }

        HttpContext.Current.ApplicationInstance.AuthorizeRequest -= AuthorizeRequest;
    }
}


Answer 4:

[Authorize]
public class BaseController : Controller
{
    protected override void OnAuthorization(AuthorizationContext authContext)
    {
        if
            (
            !User.Identity.IsAuthenticated &&
            Request.LogonUserIdentity != null &&
            Request.LogonUserIdentity.IsAuthenticated
            )
        {
            var logonUserIdentity = Request.LogonUserIdentity.Name;
            if (!string.IsNullOrEmpty(logonUserIdentity))
            {
                if (logonUserIdentity.Contains("\\"))
                    logonUserIdentity = logonUserIdentity.Substring(logonUserIdentity.IndexOf("\\") + 1);

                var db = new UsersContext();
                var loginUser =
                    db.UserProfiles.FirstOrDefault(x => x.UserName == logonUserIdentity);

                //Auto-Login Windows Identity
                if (loginUser == null)
                    loginUser = CreateUser(db, logonUserIdentity);

                if (loginUser != null)
                {
                    FormsAuthentication.SetAuthCookie(loginUser.UserName, true);

                    string returnUrl = Request.RawUrl;
                    if (!string.IsNullOrEmpty(returnUrl))
                        Response.Redirect(returnUrl);
                    Response.Redirect("~/");

                }
            }
        }
    }

    private static UserProfile CreateUser(UsersContext db, string logonUserIdentity)
    {
        var user = new UserProfile {UserName = logonUserIdentity};
        db.UserProfiles.Add(user);
        db.SaveChanges();
        return user;
    }
}


文章来源: How to implement authorization checks in ASP.NET MVC based on Session data?