针对多个数据库的WCF OData服务

时间:2015-09-29 20:21:22

标签: c# .net sql-server wcf wcf-data-services

我们的架构有许多数据库,都具有相同的架构。我想通过我们的SQL Server的WCF服务公开odata服务。我们正在使用Entity Framework Odata Service Provider来实现此实现。

我看过这篇文章,但他的要求需要合并数据。

我只需要进行身份验证,然后将用户定向到存储数据的数据库。

有没有人知道如何在图层中添加一个odata身份验证服务,该服务会根据经过身份验证的用户将连接字符串设置为正确的数据库?

1 个答案:

答案 0 :(得分:0)

我转而使用Web Api 2和Odata Integration。

进入Web Api后,您可以创建过滤器以挂钩并添加逻辑,然后选择特定的数据库。

我也可以使用内置的OAuth2进行身份验证。

public class MyOdataController : ODataController
{
    protected AMMetricsEntities db;
    protected EntityConnection ec;
    protected IEnumerable<Claim> claims;
    protected long userId;
    protected string userName;

    private string GetConnectionString(string dbId, string dbName)
    {
        // this is where we get token from header information and populate the connection string
        return
            String.Format(
                "metadata=res://*/Models.AMModel.csdl|res://*/Models.AMModel.ssdl|res://*/Models.AMModel.msl;" +
                "provider=System.Data.SqlClient;" +
                "provider connection string='data source={0};initial catalog={1};persist security info=True;user id={2};password={3};" +
                "multipleactiveresultsets=True;application name=EntityFramework'",
                dbServer,
                dbName,
                Username,
                Password);
    }

    public MyOdataController()
    {

        claims = ((ClaimsIdentity)User.Identity).Claims;
        if (claims.Any())
        {
            userId = Convert.ToInt64(User.Identity.GetUserId());
            userName = User.Identity.GetUserName();

            var dbName = claims.Where(s => s.Type == "DBName").Select(c => c.Value).First();
            var dbServer = claims.Where(s => s.Type == "DBServer").Select(c => c.Value).First();

            ec = new EntityConnection(GetConnectionString(dbServer, dbName));
            db = new ProductEntities(ec, false);
        }
    }
}