在运行时为使用基本身份验证的OData / WCF数据服务更改连接字符串

时间:2011-12-15 12:36:06

标签: wcf authentication connection odata edmx

我有一个具有单一架构的ODATA服务。这些指向开发数据库,​​并通过WCF数据服务提供服务,然后由运行Excel / Powerpivot的客户端使用它来获取报告等自己的数据。

该服务在运行时通过几乎相同的基本身份验证进行保护:http://msdn.microsoft.com/en-us/data/gg192997

现在,如何在实时环境中工作,它位于服务器上,并根据提供的用户名/密码连接到不同的数据库。用户将输入'username @ clientID'和'password'。然后对'username @ clientID'进行split(),并根据SQL数据库检查用户名/密码。但要检查的数据库服务器URL将由ClientID确定。

此外,一旦获得授权,WCF数据服务需要从与ClientID相对应的数据库中返回数据。

我尝试的方法是修改web.config文件中的连接字符串,但这不起作用,因为它说该文件是只读的。我甚至不确定这是否会起作用。我需要做的是让EDMX / WCF数据服务从正确的数据库返回数据。这是我试图做的事情:

    private static bool TryAuthenticate(string user, string password, out IPrincipal principal)
    {

        Configuration myWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
        myWebConfig.AppSettings.Settings["test"].Value = "Hello";
        myWebConfig.Save();

        string newConnStr = myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ToString();
        newConnStr.ToString().Replace("SERGEIX01", "SERVERX01");
        myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ConnectionString = newConnStr;            
        myWebConfig.Save();

        if (user.ToLower().Equals("admin") && password.Equals("password"))
        {
            principal = new GenericPrincipal(new GenericIdentity(user), new string[] { "Users" });
            return true;
        }
        else
        {
            principal = null;
            return false;
        }
    }

2 个答案:

答案 0 :(得分:5)

在您的DataService派生类中重写CreateDataSource方法,并在其中找出正确的连接字符串,为连接字符串创建EF对象上下文的新实例并将其返回。 WCF DS服务不会在EF对象上下文中使用默认构造函数,这完全取决于您使用正确的连接字符串构造实例。

答案 1 :(得分:1)

svc.cs文件中添加以下内容:

protected override NorthWindEntity CreateDataSource()
{
    System.Data.EntityClient.EntityConnection connection = new System.Data.EntityClient.EntityConnection();
    connection.ConnectionString = "";
    NorthWindEntity ctx = new NorthWindEntity(connection);
    return ctx;
}