gpt4 book ai didi

wcf - OAuth 和 WCF SOAP 服务

转载 作者:行者123 更新时间:2023-12-03 15:59:09 24 4
gpt4 key购买 nike

我正在尝试为 WCF SOAP 服务实现 OAuth 安全性。我可以在网上找到关于 OAUTH 和 REST 服务的示例。是否有将 OAuth 与 WCF SOAP 服务一起使用的最佳方法。如果可以保护 WCF SOAP 使用 OAUth,我还想知道在这种情况下是否可以使用基于声明的授权。

最佳答案

简短的回答是简单的"is",您可以这样做。我试图找到一种“官方”的方法来做到这一点,但我没有成功,主要是因为 OAuth 并不是真正为这种情况设计的,稍后会详细介绍。首先虽然如何实际做到这一点。一种方法是提供自定义 ServiceAuthorizationManager在它里面做这样的事情

public class OAuthAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
// Extract the action URI from the OperationContext. Match this against the claims
// in the AuthorizationContext.
string action = operationContext.RequestContext.RequestMessage.Headers.Action;

try
{
//get the message
var message = operationContext.RequestContext.RequestMessage;

//get the http headers
var httpHeaders = ((System.ServiceModel.Channels.HttpRequestMessageProperty)message.Properties.Values.ElementAt(message.Properties.Keys.ToList().IndexOf("httpRequest"))).Headers;


//get authorization header
var authHeader = httpHeaders.GetValues("Authorization");

if (authHeader != null)
{
var parts = authHeader[0].Split(' ');

if (parts[0] == "Bearer")
{
var tokenClaims = ValidateJwt(parts[1]);
foreach (System.Security.Claims.Claim c in tokenClaims.Where(c => c.Type == "http://www.contoso.com/claims/allowedoperation"))
{
var authorized = true;
//other claims authorization logic etc....
if(authorized)
{
return true;
}
}
}
}
return false;

}
catch (Exception)
{
throw;
}

}

private static IEnumerable<System.Security.Claims.Claim> ValidateJwt(string jwt)
{
var handler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters()
{
ValidAudience = "urn://your.audience",
IssuerSigningKey = new InMemorySymmetricSecurityKey(Convert.FromBase64String("base64encoded symmetric key")),
ValidIssuer = "urn://your.issuer",
CertificateValidator = X509CertificateValidator.None,
RequireExpirationTime = true
};

try
{
SecurityToken validatedToken;
var principal = handler.ValidateToken(jwt, validationParameters, out validatedToken);

return principal.Claims;

}
catch (Exception e)
{
return new List<System.Security.Claims.Claim>();
}

}
}
确保还使用 serviceAuthorizationElement 将 web.config 设置为使用此自定义类。
此示例还需要 System.IdentityModel.Tokens.Jwt nuget 包,但您的 token 可能采用另一种格式,在这种情况下,您只需替换示例中的该逻辑。另请注意,此示例假设您将在 http 请求中的 Authorization header 上传递我们的 token ,即 OAuth 2.0 Authorization Framework: Bearer Token Usage文档还指定也可以使用表单编码的正文参数和 URI 查询参数。表单编码的正文参数方法可能与 SOAP 服务完全不兼容,但我认为您没有理由不修改此代码以在需要时还查看查询参数方法。
此代码的作用是针对 CheckAccessCore 方法将触发的每个服务请求,在它内部尝试提取和验证 JWT oauth token ,然后您可以使用提取的原则和相关声明来授权或拒绝对请求的授权。
所有这一切都说,我认为最好的方法是根本不使用 OAuth,上述方法有效,但它是对如何保护 WCF SOAP 服务的一种黑客攻击。 OAuth 也不意味着对用户进行身份验证,因此在将通过身份验证获得的不记名 token 传递给您的服务之前,您需要以其他方式进行身份验证。如果你绝对必须使用 OAuth,你可以使用上面的方法来帮助你入门,可能有更好的方法,但无论如何都不容易使其工作和可读。如果您还没有查看 WS-Security您应该这样做,并熟悉为确保基于 SOAP 的服务而存在的大量信息和可能性,其中大部分在此处都有许多示例。

关于wcf - OAuth 和 WCF SOAP 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com