gpt4 book ai didi

wcf - 可以将自定义 UserNamePasswordValidator 用作角色提供者吗?

转载 作者:行者123 更新时间:2023-12-04 18:28:57 28 4
gpt4 key购买 nike

this question 相关,我有一个自定义的 UserNamePasswordValidator 登录到我们的内部 API。作为登录的一部分,我可以发现用户在我们系统中的角色。

我想稍后在 PrincipalPermissionAttribute 要求中使用这些服务方法,例如:

[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "System Administrator")]
public string HelloWorld()
{ /* ... */ }

最佳答案

扩展拉迪斯拉夫的回答:

没有。自定义 UserNamePasswordValidator 不能用作角色提供者。 UserNamePasswordValidator 在与您想要处理的 OperationContext 不同的上下文(或线程或其他东西)中运行。

您需要做的是实现自定义授权。我找到了 this page这样做最有用。警告:在你找到有趣的部分之前有很多管道。

基本上,您从 ServiceCredentials 派生类开始,在 App.config 中注册,如下所示:

<serviceBehaviors>
<behavior name="...">
<serviceAuthorization principalPermissionMode="Custom" />

<serviceCredentials type="MyNamespace.MyServiceCredentials, MyAssembly">
<userNameAuthentication userNamePasswordValidationMode="Custom" />

<serviceCertificate etc. />
</serviceCredentials>

将行为与您的服务相关联。

覆盖 ServiceCredentials.CreateSecurityTokenManager 以返回从 ServiceCredentialsSecurityTokenManager 派生的 MySecurityTokenManager。在此之上,覆盖 CreateSecurityTokenAuthenticator,返回一个 MySecurityTokenAuthenticator。这应该来自 CustomUserNameSecurityTokenAuthenticator。在那里,覆盖 ValidateUserNamePasswordCore。调用基类,将返回授权策略列表。

向该列表添加一个新列表:MyAuthorizationPolicy,它实现了 IAuthorizationPolicy。这样,您只需(哈哈)执行以下操作:

public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
IList<IIdentity> identities = GetIdentities(evaluationContext);

// Find the GenericIdentity with our user-name in it.
IIdentity currentIdentity = identities.SingleOrDefault(
i => i is GenericIdentity &&
StringComparer.OrdinalIgnoreCase.Equals(i.Name, UserName));
if (currentIdentity == null)
throw new InvalidOperationException("No Identity found");

// Replace the GenericIdentity with a new one.
identities.Remove(currentIdentity);
var newIdentity =
new GenericIdentity(_userName, currentIdentity.AuthenticationType);
identities.Add(newIdentity);

// This makes it available as
// ServiceSecurityContext.Current.PrimaryIdentity later.
evaluationContext.Properties["PrimaryIdentity"] = newIdentity;

// This makes it available as Thread.CurrentPrincipal.
IPrincipal newPrincipal = new GenericPrincipal(newIdentity, _roles);
evaluationContext.Properties["Principal"] = newPrincipal;

return true;
}

private static IList<IIdentity> GetIdentities(
EvaluationContext evaluationContext)
{
object identitiesProperty;
if (!evaluationContext.Properties.TryGetValue(
"Identities", out identitiesProperty))
throw new InvalidOperationException("No Identity found");

var identities = identitiesProperty as IList<IIdentity>;
if (identities == null)
throw new InvalidOperationException("No Identity found");
return identities;
}

然后,做完这些,您可以使用 PrincipalPermission 标记您的服务操作:

[PrincipalPermission(SecurityAction.Demand, Role = "Editor")]

关于wcf - 可以将自定义 UserNamePasswordValidator 用作角色提供者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554902/

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