【问题标题】:ASP .Net MVC and WCF Identity (Claims) IntegrationASP .Net MVC 和 WCF 身份(声明)集成
【发布时间】:2015-06-13 16:55:45
【问题描述】:

我们正在构建一个客户端是 ASP .Net MVC 的平台,使用 ASP Net Identity 2.0 进行身份验证和授权(使用声明),这在 Web 端非常有效。

我们还有一个 WCF 服务,它允许对数据库进行 CRUD 操作(用于多个客户端应用程序),它从这个 ASP .Net MVC 客户端获取请求。 由于我们想在 WCF 端进行特定的 CRUD 操作之前验证(验证和授权)用户,我们需要从客户端获取用户的声明,并执行验证(最好以非常干净的方式使用标头或任何WCF 将能够支持此问题的绑定)。

我一直在搜索不同的论坛,但没有针对此特定场景的简单答案\教程。有人可以帮忙解决这个问题吗?

谢谢, 尼尔。

【问题讨论】:

  • 尼尔,您的问题似乎是将声明传递给您的 WCF 服务。您可以传递从 Identity 获得的实际声明,或者您可以传递一个数组或 DTO 代表您想要传递给您的服务的授权和 Id 的值...
  • @nirpi,您希望您的服务使用什么:凭据或安全令牌?
  • @DaveAlperovich,如果可能的话,我想从标头中获取声明,因此我不需要使用额外的身份验证参数“弄脏”我所有的公共方法。
  • @LeonidVasilyev,如果可能的话,我希望我的服务能够获取经过身份验证的用户及其声明。另一种选择是获取令牌,然后以某种方式从某处获取用户 + 声明(最好通过缓存),但不确定是否可以这样做。
  • 您可以使用 WCF 来做到这一点。我会使用 Web API。更容易整合身份。我毫不怀疑 Identity 可以在 WCF 中使用,但它还没有这样配置。

标签: asp.net-mvc wcf asp.net-identity wcf-security claims-based-identity


【解决方案1】:

我喜欢这个:

在您的 IEndpointBehavior 实现中,在客户端执行此操作:

public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        request.Headers.Add(MessageHeader.CreateHeader("token", "http://myurl.com/service/token", _theToken));
        return null;
    }

然后在服务端将其添加到您的 ServiceAuthenticationManager

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
        ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
    {
        IPrincipal user = new MyUserPrincipal(null);

        if(_currentServiceContractType.GetInterfaces()
                                        .Any(x => x == typeof(IMySecuredService)))
        {
            var tokenPosition = message.Headers.FindHeader("token", "http://myurl.com/service/token");

            if (tokenPosition >= 0 && tokenPosition <= 5)
            {
                var encryptedToken = message.Headers.GetHeader<string>(tokenPosition);

                if (!string.IsNullOrWhiteSpace(encryptedToken))
                {
                    var serializedToken = new MyEncryptionUtility().Decrypt(encryptedToken);
                    var token = MyTokenSerializer.Deserialize(serializedToken);
                    var expire = new DateTime(token.ValidToTicks);
                    if (expire > DateTime.Now)
                    {
                        user = new MyUserPrincipal(token);
                    }
                }
            }   
        }
        message.Properties["Principal"] = user;
        Thread.CurrentPrincipal = user;
        return authPolicy;
    }

这使您能够使用内置声明或 WIF 声明身份验证。不管怎样,这很简单。令牌由服务创建并发送到客户端(Web)并存储在 cookie 中。然后当有任何请求时,会从 cookie 中获取令牌,然后将其发送到服务,在那里,不可避免地您可以开始添加权限服务端,而不是在 web/mvc 端执行它们,从而使用更简洁的代码库大家最喜欢的朋友,SOA >= :)

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 2020-08-04
    • 2015-03-14
    • 2011-05-02
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多