nir*_*rpi 6 asp.net-mvc wcf wcf-security claims-based-identity asp.net-identity
我们正在构建一个客户端是ASP .Net MVC的平台,使用ASP Net Identity 2.0进行身份验证和授权(使用声明),这在网络端非常有用.
我们还有一个WCF服务,允许对数据库(对于多个客户端应用程序)进行CRUD操作,该服务从这个ASP .Net MVC客户端获取请求.由于我们希望在WCF端进行特定CRUD操作之前验证(验证和授权)用户,因此我们需要从客户端获取用户的声明,并执行验证(最好使用标头或任何非常干净的方式)绑定,WCF将能够支持此事项).
我一直在搜索不同的论坛,但没有简单的答案\教程这个特定的场景.谁能协助解决这个问题?
谢谢,Nir.
小智 1
我喜欢这个:
在您的 IEndpointBehavior 实现中,在客户端执行此操作:
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
request.Headers.Add(MessageHeader.CreateHeader("token", "http://myurl.com/service/token", _theToken));
return null;
}
Run Code Online (Sandbox Code Playgroud)
然后在服务端将其添加到您的 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;
}
Run Code Online (Sandbox Code Playgroud)
这使您能够使用内置声明或 WIF 声明身份验证。不管怎样,这很简单。令牌由服务创建并发送到客户端(Web)并存储在 cookie 中。然后当有任何请求时,从 cookie 中获取令牌,然后发送到服务,在那里,您不可避免地可以开始添加权限服务端,而不是在 Web/MVC 端执行它们,使用每个人最喜欢的朋友,SOA >= :)
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |