gpt4 book ai didi

c# - WPF 应用程序的基于角色的访问控制 - 最佳实践

转载 作者:行者123 更新时间:2023-11-30 15:05:01 25 4
gpt4 key购买 nike

我需要实现某种 RBAC对于我目前正在编写的 WPF 应用程序。自 v2.0 以来,ASP.NET 具有安全性、成员身份和角色管理基础结构(如 here 所述),虽然我可以使用它,但仍然觉得在这种情况下使用它会有点老套。我欢迎任何使用过它并在类似情况下取得成功的人提供反馈。

我也考虑过使用 AD LDS,阅读 TechNet 文章并查看了一些 MSDN 代码示例,但我想知道是否有任何组件(用于 .NET)可以消除创建背后的一些固有复杂性数据库,将其设置为部署和持续维护。在这种情况下,免费或商业都可以。

关于 SO 的其他问题提到了客户端应用程序服务,但这需要将 IIS 添加到组合中,这虽然没有超出可能性范围,但这是我在项目开始时没有想到的。

在这种情况下,最佳做法是什么?该应用程序是一个典型的 n 层类型事务,它与远程 SQL Server 数据库对话,因此如果需要可以将角色存储在那里

最佳答案

您可以查看 P&P 指南/代码以获取想法(或者您可以使用他们的 block )。 http://msdn.microsoft.com/en-us/library/ff953196(v=pandp.50).aspx

我在 SQLServer 中实现了自己的后端存储。它并不难,像 User、UserRole、SecurityItem、SecurityItemUser、SecurityItemRole 这样的表。我根据 AD 对用户的 Windows 登录进行身份验证,但只将他们的 Windows 登录名存储在数据库中(例如用户表的 key )。

通过接口(interface)/提供者模型将事物抽象化是个好主意。这样,如果您的应用将来发生变化,就不需要进行太多重构。

我构建了一个增长了很多的 2 层应用程序(WPF -> SQLServer),并且管理层决定为了安全他们现在想要一个 3 层应用程序(WCF 中间层)。我现在正在研究这个,这真的很痛苦,因为我将我的授权代码与客户端应用程序结合得太紧密了。现在很明显,授权应该发生在服务层,但需要做大量工作。

关于如何识别特定的“安全对象”,我想到了一个可以节省大量工作的好技巧。虽然,具有讽刺意味的是,这是我现在试图为 3 层重新设计它的问题的一部分。诀窍是使用类的完全限定名称作为安全对象的唯一标识符,然后每次检查时都可以使用一些简单的代码:

_secUtil.PromptSecurityCheck(_secUtil.GetFullyQualifiedObjectName(this, "Save"))

这里有一些其他代码可以让您了解我是如何做到的(使用 P&P 框架)。

public class SecurityUtil : ISecurityUtil
{
public string DatabaseUserName { get { return LocalUserManager.GetUserName(); } }

public bool PromptSecurityCheck(string securityContext)
{
bool ret = IsAuthorized(securityContext);

if (!ret)
{
MessageBox.Show(string.Format("You are not authorised to perform the action '{0}'.", securityContext), Settings.Default.AppTitle,
MessageBoxButton.OK, MessageBoxImage.Error);
}

return ret;
}

public bool IsAuthorized(string securityContext)
{
IAuthorizationProvider ruleProvider = AuthorizationFactory.GetAuthorizationProvider("MyAuthorizationProvider");

//bool ret = ruleProvider.Authorize(LocalUserManager.GetThreadPrinciple(), securityContext);
bool ret = ruleProvider.Authorize(LocalUserManager.GetCurrentPrinciple(), securityContext);
return ret;
}

public string GetFullyQualifiedName(object element)
{
return element.GetType().FullName;
}

public string GetFullyQualifiedObjectName(object hostControl, string objectName)
{
return GetFullyQualifiedName(hostControl) + "." + objectName;
}
}

[ConfigurationElementType(typeof(CustomAuthorizationProviderData))]
public class MyAuthorizationProvider : AuthorizationProvider
{
public SitesAuthorizationProvider(NameValueCollection configurationItems)
{
}

public override bool Authorize(IPrincipal principal, string context)
{

bool ret = false;

if (principal.Identity.IsAuthenticated)
{
// check the security item key, otherwise check the screen uri
ret = LocalCacheManager.GetUserSecurityItemsCache(LocalUserManager.UserId, false).Exists(
si => si.SecurityItemKey.Equals(context, StringComparison.InvariantCultureIgnoreCase));

if (!ret)
{
// check if this item matches a screen uri
ret = LocalCacheManager.GetUserSecurityItemsCache(LocalUserManager.UserId, false).Exists(
si => si.Uri.Equals(context, StringComparison.InvariantCultureIgnoreCase));
}
}

return ret;

}
}

关于c# - WPF 应用程序的基于角色的访问控制 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com