无法获取WCF基本身份验证来对用户进行身份验证

本文关键字:身份验证 用户 获取 WCF | 更新日期: 2023-09-27 18:18:43

所以在这个阶段,在尝试让这个工作之后,我现在求助于问大家这个问题。

是的,我经历了一堆类似于我的堆栈溢出问题,但无济于事。

我想做的就是通过SSL添加基本身份验证。从我浏览的150万4千7个教程来看,这似乎真的是一项简单的任务。

我得到的只是一个弹出的对话框,要求我输入用户名和密码,但即使我传递了正确的凭据,它也会一次又一次地弹出。

我还在iis express中使用了配置设置。如果我禁用基本身份验证,我会得到一个错误,抱怨这没有打开。

我知道我是金发碧眼,但在我在屏幕上开个洞之前,这里是我的web.config

<标题> web . config h1> 证类
namespace Booky
{
    public class Authentication : System.IdentityModel.Selectors.UserNamePasswordValidator
    {
        public override void Validate(string UserName, string Password)
        {
            if (UserName == null || Password == null)
            {
                throw new ArgumentNullException("Username or Password is Incorrect");
            }
            if (!(UserName == "wickd" && Password == "OMIG2015"))
            {
                throw new Exception("Invalid Credentials");
            }
        }
    }
}
<标题> Machine_SVC h1> IMachine_SVC h1> div class="answers">

如果您在IIS中托管此服务,那么您将面临问题,因为自定义密码验证器不是为IIS托管构建的。它将与独立托管完美地工作。请注意,这只在自托管服务下支持。

您可以通过扩展"ServiceAuthorizationManager"类来实现它,而不是使用自定义验证器。

public class RestAuthorizationManager: ServiceAuthorizationManager  
{  
    protected override bool CheckAccessCore(OperationContext operationContext)
    {
        //Extract the Authorization header, and parse out the credentials converting the Base64 string:
        var authHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
        if ((authHeader != null) && (authHeader != string.Empty))
        {
            var svcCredentials = System.Text.ASCIIEncoding.ASCII
                    .GetString(Convert.FromBase64String(authHeader.Substring(6)))
                    .Split(':');
            var user = new { Name = svcCredentials[0], Password = svcCredentials[1] };
            if ((user.Name == "user1" && user.Password == "test"))
            {
                //User is authrized and originating call will proceed
                return true;
            }
            else
            {
                //not authorized
                return false;
            }
        }
        else
        {
            //No authorization header was provided, so challenge the client to provide before proceeding:
            WebOperationContext.Current.OutgoingResponse.Headers.Add("WWW-Authenticate: Basic realm='"MyWCFService'"");
            //Throw an exception with the associated HTTP status code equivalent to HTTP status 401
            throw new WebFaultException("Please provide a username and password", HttpStatusCode.Unauthorized);
        }
    }
}

RestAuthorizationManager加入业务行为。

<serviceBehaviors>  
  <behavior name="ServiceBehavior">  
    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>  
    <serviceDebug includeExceptionDetailInFaults="true"/>  
    <serviceAuthorization   
      serviceAuthorizationManagerType  
        =" WcfWebHttpIISHostingSample.RestAuthorizationManager, WcfWebHttpIISHostingSample"/>  
  </behavior>  
</serviceBehaviors>  

这应该能让你继续。

我写了一个完整的指南来创建和保护WCF REST服务与SSL的基本身份验证。即使安全行为也是WCF REST和webhttp行为扩展库的一部分,您也可能想要浏览它。

无法获取WCF基本身份验证来对用户进行身份验证