繁体   English   中英

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

[英]ASP.Net MVC claims authorization and authentication

请帮助我决定如何为我的项目做授权。

该项目用ASP.Net MVC编写,是一个Intranet应用程序,允许用户通过Active Directory登录。

用户可以是初级讲师,高级讲师,HOD或超级用户。 使用角色很容易,但是情况要复杂得多,因为这些角色基于您正在查看的任何信息。 例如,初级讲师只能看到他讲课的学生的信息等。

据我了解,这就是索赔的来源。我应该为用户分配模块或学生。

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

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

但是有时,有权查看某些信息的用户将不会通过任何这些检查。 因此,我将不得不创建一个具有AD用户名,他们的角色以及他们的科目/学生的数据库。

所以我的问题真的是关于授权。 我是否可以对索赔有这样的控制权,我将如何分配它们并对其进行检查?

如果不可能-我将如何进行此授权?

在每个Controller的每个Action开头都有一个if语句感觉很不对-但这就是我所有同事所能想到的。

如果您创建一个从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属性在每个级别上控制您的authorize

但是,您确实需要一个结构良好的实体来这样做,以免丢失所有规则。 强烈建议您在提交此授权计划之前,为您的授权计划制定适当的计划。

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

请注意:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM