ASP.Net MVC要求授权和身份验证

本文关键字:授权 身份验证 Net MVC ASP | 更新日期: 2023-09-27 18:10:45

请帮我决定一下我的项目如何授权。

项目是用ASP编写的。Net MVC,是一个允许用户通过活动目录登录的内部网应用程序。

用户可以是初级讲师,高级讲师,HOD或超级用户。对于角色来说,这很简单,但情况要复杂得多,因为这些角色是基于你所看到的任何信息的。例如,初级讲师只能看到他讲课的学生的信息等。

据我所知,这就是索赔的由来。我应该将模块或学生分配给用户。

但是这个过程会更加复杂,因为在任何一个地方都没有AD用户名及其学生/模块的列表。

我需要能够检查几个数据库,看看是否应该允许用户看到信息。

但有时,有权查看某些信息的用户不会通过这些检查。因为,我将不得不创建一个数据库与AD用户名,他们的角色和他们的主题/学生。

我的问题是关于授权的。我有可能对索赔有那种程度的控制吗?我该如何分配和检查它们?

如果这是不可能的-我要怎么做这个授权?

在每个控制器的每个动作的开始都有一个if语句感觉不对-但这就是我的同事们能想到的。

ASP.Net MVC要求授权和身份验证

如果您创建了一个继承自AuthorizeAttribute的类,那么您可以自由地执行任何您认为合适的复杂授权过程。请看我在这里给出的答案。

下面是我用来查询和缓存AD角色的一些代码:

private static Dictionary<Tuple<string, string>, bool> groupIdentityCache = new Dictionary<Tuple<string, string>, bool>();

.

public static bool UserHasRole(IIdentity identity, string groupShortName)     
{
    // (we rename our actual AD roles to shorter ones relevant to the site
    // e.g. [MyAuthorizeAttribute(Roles = "Support,Admin")])
    if (!AdLongGroupNames.ContainsKey(groupShortName.ToUpper())) return false;
    string fullADGroupName = AdLongGroupNames[groupShortName.ToUpper()];            
    Tuple<string, string> key = new Tuple<string, string>(identity.Name.ToUpper(), groupShortName.ToUpper());
    if (!groupIdentityCache.ContainsKey(key))
    {
        using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))      
        {
            using (GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, fullADGroupName))
            {
                using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, GetLogin(identity)))
                {
                    groupIdentityCache[key] = userPrincipal.IsMemberOf(groupPrincipal);
                }
            }
        }                
    }            
    return groupIdentityCache[key];
}
public static string GetLogin(IIdentity identity)
{
    string[] parts = identity.Name.Split('''');
    if (parts.Count() < 2) return parts[0]; else return parts[1];
}

如果你缓存角色成员,你必须清除Session_Start上的缓存以使更改生效。

您可以修改此解决方案,通过添加到groupIdentityCache字典来包含来自非ad源(例如类成员关系数据库等)的角色。修改groupIdentityCache也可以帮助测试。

使用'if'语句是错误的,它将花费你长时间的迭代和大量的内存滥用。

基本上,您几乎可以使用authorize属性来控制每个级别的授权。

然而,你确实需要一个构建良好的实体来做到这一点,为了不迷失在所有的规则中。强烈建议您在提交授权方案之前对授权方案有一个适当的计划。

您可以尝试使用switch语句,这在实践中会好得多。

请注意:

授权文章,可能会帮助您理解。