从Active Directory进行身份验证,但从MVC中的SQL数据库授权角色

时间:2019-03-01 07:09:21

标签: c# asp.net-mvc model-view-controller windows-authentication

我是MVC的新手。我搜索后,没有找到适合我要求的解决方案。

我正在开发一个供团队内部使用的Web门户,该门户使用Windows AD身份验证进行登录。但是,对于基于角色的访问,我创建了一个本地数据库,该数据库可以返回用户的“角色”详细信息。 我创建了一个自定义“授权”过滤器,该过滤器使我可以根据用户角色来处理授权。该过滤器正在从数据库中查询详细信息,但是这种方法的问题是,它将尝试从数据库中获取对控制器的每个请求的详细信息,这会增加成本。

如何将从数据库中获取的用户详细信息保存在令牌中,这样我就不必为每个请求都查询数据库并使用授权过滤器中的令牌值。另外,我可以使用从数据库中,应用程序中其他任何位置为用户检索的值。 (对于数据库中的用户,还有其他一些详细信息。)

如果有人可以提出更好的方法来实现这一目标,请提供帮助。

这是我当前在“授权”过滤器中使用的代码:

library(dplyr)

Date1 <- c("1999-12-17", "2005-1-5", "2003-11-2", "2005-6-12", "2005-8-9")
Date1 <- as.POSIXct(Date1, tz = "UTC")

Date2 <- c("2005-1-5", "2005-6-12", "2005-8-9")
Date2 <- as.POSIXct(Date2, tz = "UTC")

var1 <- c(-3, -10, 9, 5, 8)
var2 <- c(0.2, 0.6, 0.15)

dat1 <- data.frame(Date1, var1)
dat2 <- data.frame(Date2, var2)

#Below is what I did
tmp <- inner_join(dat1, dat2, by = c("Date1" = "Date2"))
tmp <- tmp[-tmp$var1 < 0, ]

dat2 <- tmp[, c(1,3)] 

请建议您在哪个部分使用将建议的代码(例如,在控制器内部,在过滤器内部或其他位置)。

我在以下位置找到了此解决方案:this site,但该解决方案用于AD组。

2 个答案:

答案 0 :(得分:1)

首先,您可能需要考虑使用AD安全组来管理访问。这样,OPS可以继续在熟悉的经过时间考验的平台上维持访问权限,而您不必编写自己的安全性定义界面。

关于MVC安全持久性 您所要做的就是添加手动登录以执行上述逻辑,然后使用内置的成员资格提供程序(无论使用什么版本的MVC)来登录用户。MVC将处理维护登录状态的操作并为您代币化,您可以在web.config(或Core中的settings.json)中指定超时等内容。

抱歉,我手边没有任何示例代码可用于说明。

答案 1 :(得分:1)

我已经在方法AuthorizeCore的替代版本中检查了cookie,它现在可以工作:

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = httpContext.Request.Cookies[cookieName];
        _authenticated = base.AuthorizeCore(httpContext);
        string authToken = httpContext.Request.Headers["Auth-Token"];

        if (_authenticated)
        {
            if (authCookie == null)
            {
                if (string.IsNullOrEmpty(InRoles))
                {
                    _authorized = true;
                    return _authorized;
                }

                if (!string.IsNullOrEmpty(httpContext.User.Identity.Name))
                {
                    string NTID = httpContext.User.Identity.Name.Split('\\')[1];
                    var roles = InRoles.Split(',');

                    using (Models.UserAuthEntities userAuthEntities = new Models.UserAuthEntities())
                    {
                        try
                        {
                            ObjectResult<Models.Validate_User_Login_Result> userResults = userAuthEntities.Validate_User_Login(NTID);
                            var user = userResults.FirstOrDefault(all => all.NTID == NTID);

                            if (user == null)
                            {
                                _authorized = false;
                                return _authorized;
                            }
                            else
                            {
                                if (roles.Contains(user.Role))
                                {
                                    _authorized = true;
                                    return _authorized;
                                }
                            }
                        }
                        catch (Exception)
                        {
                            _authorized = false;
                            return _authorized;
                        }
                    }
                }
                else
                {
                    _authorized = false;
                    return _authorized;
                }
            }
        }

        _authorized = false;
        return _authorized;
    }