WCF数据服务更新返回401-未授权:由于凭据无效,访问被拒绝

时间:2010-11-01 20:11:52

标签: c# wcf service

我有一个WCF数据服务,我正在尝试在DataServiceContext客户端上使用UpdateObject方法。当我调用SaveChanges方法时,我得到以下错误页面:

  

未经授权:由于凭据无效,访问被拒绝
  您无权使用您提供的凭据查看此目录或页面。

有没有人对我如何解决这个问题有任何想法?我发现this,理论上可以解决问题,但设置此磁盘访问权限对于生产服务来说不是一个现实的解决方案。请记住,在我的本地计算机上运行此WCF数据服务时,它可以正常工作。我的电话的C#代码如下:

        public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
    {
        var userName = ( string ) context[ "UserName" ];
        var isAuthenticated = ( bool ) context[ "IsAuthenticated" ];
        if (userName != null && userName.Length >= 1 && collection.Count >= 1)
        {
            var allNames = string.Empty;
            var allValues = string.Empty;
            byte[] buf = null;
            PrepareDataForSaving( ref allNames, ref allValues, ref buf, true, collection, isAuthenticated );
            if (allNames.Length != 0)
            {
                var client = GetDataContext( );
                var profile = client.ProfileViews.Where(p => p.UserName == userName).FirstOrDefault();
                if (profile == null)
                {
                   profile = new ProfileView() { UserName = userName };
                    client.AddToProfileViews(profile);
                }
                profile.PropertyNames = allNames;
                profile.PropertyValuesString = allValues;
                profile.PropertyValuesBinary = buf;
                profile.LastUpdateDate = DateTime.UtcNow;


                client.UpdateObject(profile);
                client.SaveChanges( );
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

我遇到了使用WCF数据服务的Silverlight应用程序的类似问题。用户可以查看应用程序中的数据---来自数据库的SELECTS正在运行---但是他们收到了相同的“401 - 未经授权:访问被拒绝以及无效凭证。”您正在描述他们何时尝试将更改保存到数据库(即,在代码中执行SaveChanges时)。最基本的问题是IIS应用程序文件夹本身的权限问题。要解决此问题,我们必须授予WCF服务使用的应用程序池对该文件夹的写入权限。

  1. 转到IIS并右键单击包含WCF服务的虚拟目录,然后选择Manage Application - >高级设置....记下应用程序池名称。

  2. 在同一右键菜单中,选择编辑权限.....在安全选项卡上,检查组和用户名。

  3. 如果缺少应用程序池的名称。使用名称格式“IIS APPPOOL \ MyApplicationPoolName”添加它。请参阅此有用链接:http://www.bluevalleytech.com/techtalk/blog/assigning-ntfs-folder-permission-to-iis7-application-pools/

  4. 确保MyApplicationPoolName具有写权限(我们实际上已将其完全控制)

答案 1 :(得分:0)

在我的情况下,我在IIS 7.5上托管的WCF数据服务上使用kerberos(useAppPoolCredentials = true)进行了模拟Windows身份验证。奇怪的是我可以成功选择和插入数据,但是当我尝试更新时,我得到了一个401.3访问被拒绝错误。解决方案是给出web配置(myRole)中指定的AD组:

<authorization>
  <allow roles="myRole"/>  
  <deny users="*" />
</authorization>

对Dan Sabin说的应用程序文件夹的读写权限。错误消息是:

错误消息401.3:您无权使用您提供的凭据查看此目录或页面(由于访问控制列表而拒绝访问)。请Web服务器的管理员为您提供访问权限