P & Pガイダンス/アイデアおそらくそれらのブロックを使用することができます)。 http://msdn.microsoft.com/en-us/library/ff953196(v=pandp.50).aspx
SQLServerに独自のバックエンドストアを実装しました。 User、UserRole、SecurityItem、SecurityItemUser、SecurityItemRoleのようなテーブルはそれほど難しくありません。私はADに対してユーザーのWindowsログインを認証しますが、Windowsログイン名をデータベースに保存します(Userテーブルのキーなど)。
インタフェース/プロバイダモデルを介して物事を抽象化することをお勧めします。そうすれば、あなたのアプリが将来変更された場合でも、多くのリファクタリングを必要としません。
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;
}
}
AD LDSの場合、適切な権限を持っている場合は、ADストアにデータをホストできます。うまくいけば、これはあなたのための問題を簡素化するでしょうか? – code4life
@ code4lifeこのウェブの例は何ですか? – noonand
ここから始めます。http://msdn.microsoft.com/en-us/library/aa772138.aspx FYIのように、AD LDSは必ずしもデータベースよりも単純なものにするわけではありません。 – code4life