首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用System.ServiceModel.ServiceAuthenticationManager?的自定义WCF身份验证

使用System.ServiceModel.ServiceAuthenticationManager?的自定义WCF身份验证
EN

Stack Overflow用户
提问于 2010-09-15 16:12:41
回答 1查看 13.8K关注 0票数 17

我正在研究自定义的WCF身份验证和授权,我找到了一些关于UserNamePasswordValidator和ServiceAuthorizationManager的文章。

我还发现了一些关于使用自定义System.ServiceModel.__ServiceAuthenticationManager (死链接)的线索,但msdn并没有提供太多关于它的信息( http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx )。

所以我来了:有人知道更多关于ServiceAuthenticationManager的事情吗?

通常,您将如何设置自定义WCF身份验证?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-01 21:43:37

你说得对,关于这方面的文档一点帮助都没有。

我使用这个类的方法如下。重写Authenticate()方法以:

  1. 从传入的message
  2. Authenticate中拉取身份验证令牌(例如用户名/密码),并使用它们创建IPrincipal对象。这将是在调用服务操作期间使用的主体。
  3. 将IPrincipal对象添加到message.Properties集合,以便稍后可以在

处理管道中使用该对象

您不能在这一点上只是设置线程主体,因为它稍后会被WCF更改。

ServiceAuthenticationManager.Authenticate()方法中的代码如下所示:

代码语言:javascript
复制
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
{
   int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org");
   string token = message.Headers.GetHeader<string>(tokenPosition);

   IPrincipal user = new CustomPrincipal(token);

   message.Properties["Principal"] = user;

   return authPolicy;
}

然后添加一个自定义授权策略,该策略

  1. 从消息中检索IPrincipal (使用基于EvaluationContext.Properties ()方法

的EvaluationContext.Properties IPrincipal.IsInRole claims中的

IAuthorizationPolicy()方法中的代码如下所示

代码语言:javascript
复制
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
    IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal;
    evaluationContext.Properties["Principal"] = user;
    evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity };

    IList<Claim> roleClaims = this.GetRoleClaims(user);

    evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims));

    return true;
}

在服务行为配置中,您需要将principalPermissionMode=设置为“自定义”,以便将IPrincipal设置为实际服务操作调用的执行线程上的主体。

代码语言:javascript
复制
<serviceAuthorization principalPermissionMode="Custom"...
票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3715778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档