【问题标题】:Connection string per user with WCF Services每个用户使用 WCF 服务的连接字符串
【发布时间】:2012-01-28 04:32:39
【问题描述】:

我们正在开发一个带有 WCF 服务的 ASP.NET MVC 应用程序。问题是我们需要将应用程序与公司的标准安全模型集成。

此模型为每个应用程序用户使用不同的数据库用户和密码(连接字符串),此连接字符串在用户通过身份验证时提供,应用于所有 Web 服务连接到数据库。

我们正在研究将此连接字符串传递给 wcf 服务的最佳方式。我的团队中有人建议将此连接存储在会话中,并在每条消息中将其发送到服务,也许使用一些 WCF 可扩展性来自动传递此连接。

其他建议?

【问题讨论】:

  • 你目前使用什么认证方式?
  • 表单身份验证和验证用户的 WCF 服务,该服务是唯一使用固定数据库连接的服务。
  • 你能实现解决方案吗!!

标签: wcf web-services database-connection wcf-security


【解决方案1】:

我使用了自定义的 soap 标头来传递会话数据,这种方法在我们的生产环境中非常成功。这很简单。

【讨论】:

  • 我们完成了这个方法的实现。我们使用 EndpointBehaviour 来传递会话数据(用户和密码)。
  • 很高兴听到另一个成功的故事。此外,根据您的实例上下文模式,您还可以通过扩展将该信息放入 InstanceContext 中。然后你可以写一些包装代码来产生:'var principal = SnahiderSession.Principle;'直接来自您的服务运营。
【解决方案2】:

您可以在 WCF 服务中使用 InstanceContextMode.PerSession 与会话中的所有服务调用共享一次创建的连接实例,完成后您可以通过调用 DisposeConnection() 方法来处理连接。

希望对你有帮助!

示例:

 [ServiceContract]
 public interface IConnectionService
 {
     [OperationContract]
     void InitSqlConnection(string UserName, string passWord);

     [OperationContract]
     void DisposeSqlConnection();

     [OperationContract]
     string GetUserAccounts();

     [OperationContract]
     string GetUserRoles();

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class ConnectionService : IConnectionService
    {

        SqlConnection connection;

        public void InitSqlConnection(string UserName, string passWord)
        {
            if (connection == default(SqlConnection))
            {
                connection = new SqlConnection(string.Format("Data Source=.;Initial Catalog=WADB;User Id={0};Password={1};", UserName, passWord));
                connection.Open();
            }
        }

        public void DisposeSqlConnection()
        {
            if (connection != default(SqlConnection))
            {
                connection.Close();
                connection.Dispose();
            }
        }

        public string GetUserAccounts()
        {
            string data = string.Empty;
            if (connection != default(SqlConnection))
            {
                //// do database operation with "connection"
                SqlDataAdapter da = new SqlDataAdapter("select * from tblUserAccount", connection);
                DataSet ds = new DataSet();
                da.Fill(ds);
                data = ds.GetXml();
            }
            return data;
        }

        public string GetUserRoles()
        {
            string data = string.Empty;
            if (connection != default(SqlConnection))
            {
                //// do database operation with "connection"
                SqlDataAdapter da = new SqlDataAdapter("select * from tblUserRole", connection);
                DataSet ds = new DataSet();
                da.Fill(ds);
                data = ds.GetXml();
            }
            return data;
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多