我有一个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( );
}
}
}
答案 0 :(得分:3)
我遇到了使用WCF数据服务的Silverlight应用程序的类似问题。用户可以查看应用程序中的数据---来自数据库的SELECTS正在运行---但是他们收到了相同的“401 - 未经授权:访问被拒绝以及无效凭证。”您正在描述他们何时尝试将更改保存到数据库(即,在代码中执行SaveChanges时)。最基本的问题是IIS应用程序文件夹本身的权限问题。要解决此问题,我们必须授予WCF服务使用的应用程序池对该文件夹的写入权限。
转到IIS并右键单击包含WCF服务的虚拟目录,然后选择Manage Application - >高级设置....记下应用程序池名称。
在同一右键菜单中,选择编辑权限.....在安全选项卡上,检查组和用户名。
如果缺少应用程序池的名称。使用名称格式“IIS APPPOOL \ MyApplicationPoolName”添加它。请参阅此有用链接:http://www.bluevalleytech.com/techtalk/blog/assigning-ntfs-folder-permission-to-iis7-application-pools/
确保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服务器的管理员为您提供访问权限