我们正在建立一个平台,其中客户端是ASP .Net MVC,使用ASP Net Identity 2.0进行身份验证和授权(使用Claims),该平台在Web端效果很好。

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

我一直在搜索其他论坛,但没有针对此特定情况的简单答案\教程。任何人都可以在这件事上协助吗?

谢谢,
尼尔

最佳答案

我喜欢这个:

在您的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声明身份验证。无论如何,这很简单。 token 是由服务创建的,并发送到客户端(Web)并存储在cookie中。然后,当有任何请求时, token 将从cookie中获取,然后发送到服务,在此,您不可避免地可以开始在服务端添加权限,而不是在Web/mvc端进行权限,从而使用每个人最喜欢的 friend ,SOA> = :)

关于asp.net-mvc - ASP .Net MVC和WCF标识(声明)集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30821228/

10-14 16:34
查看更多