我有使用UserNamePasswordValidator进行自定义授权的WCF网络服务
public class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
try
{
MySession session = new MySession(userName, password);
}
catch (UnauthorizedAccessException e)
{
throw new System.IdentityModel.Tokens.SecurityTokenException("Incorrect username or password");
}
}
}
身份验证工作正常,但我不知道如何将在CustomUserNameValidator中创建的会话转移到服务。
如果您想知道,MySession来自第三方API。
答案 0 :(得分:2)
我假设你的第三方库实际上并不是为WCF构建的,你需要实现WCF授权/认证位吗?
你有没有看过这样的事情:
http://www.leastprivilege.com/CustomPrincipalsAndWCF.aspx
您可以设置Thread.CurrentPrincipal?
答案 1 :(得分:2)
经过我网络服务的几次迭代后,我得到了一个可接受的问题答案。我会立即接受的答案是,有人输入了它。
不要使用UserNamePasswordValidator。将服务配置为使用传输安全性,并将clientCredentialType设置为“None”。在Web服务方法中,首先要做的是创建一个包含从WebOperationContext.Current中提取的凭据的会话,例如:
WebOperationContext operationContext = WebOperationContext.Current;
string encoded = operationContext.IncomingRequest.Headers[HttpRequestHeader.Authorization];
if (encoded != null)
{
var decoded = Convert.FromBase64String(encoded.Substring(encoded.LastIndexOf("Basic ") + 6));
var headerValue = Encoding.UTF8.GetString(decoded);
string userName = headerValue.Substring(0, headerValue.IndexOf(":"));
string password = headerValue.Substring(headerValue.IndexOf(":") + 1, headerValue.Length - userName.Length - 1);
if (ValidCredentials(userName, password)
return new MySession(userName, password);
}
operationContext.OutgoingResponse.Headers.Add(HttpResponseHeader.WwwAuthenticate,
String.Format("Basic realm =\"MyRealm\"", Settings.EBCommunity));
throw new WebFaultException(HttpStatusCode.Unauthorized);
通过这种方式,可以轻松地在IIS上自行托管或托管Web服务,并避免使用UserNamePasswordValidator http protocol issue。