ASP .Net MVC和WCF身份(声明)集成

时间:2015-06-13 16:55:46

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

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

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

我一直在搜索不同的论坛,但没有简单的答案\教程,这个特定的场景。任何人都可以协助解决这个问题吗?

谢谢, 尼尔。

1 个答案:

答案 0 :(得分: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&gt; = :))