将WCF自定义身份验证会话转移到服务

时间:2011-06-03 15:05:34

标签: wcf authentication

我有使用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。

2 个答案:

答案 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