Как создать логин, указав базу данных или несколько строк подключения в веб-API?
У меня есть следующий код, и я хочу, чтобы пользователь мог выбрать свою базу данных в начале сеанса, чтобы он отправлял учетные данные и одновременно имя строки подключения, полученной в раскрывающемся списке меню в .html логине.
//project AccesoDatos..
//OwinContext Is it unattainable from this project? What I can do?
namespace AccesoDatos
{
public class DaoConexion: MarshalByRefObject
{
public Database DB { get; set; }
public Database DaoConexionDbContext()
{
///Obtain claims from the security database.
var claims = ((ClaimsIdentity)Thread.CurrentPrincipal.Identity);
var claim = claims.Claims.Where(x => x.Type == "ConnectionStringsName").FirstOrDefault();
if (claim ==null)
{
///Get the DefaultConnection of the web.config
///To authenticate the user and return the claims of the security database.
string DefaultConnection;
DefaultConnection = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
return DB =new SqlDatabase(DefaultConnection);
}
return DB = new SqlDatabase(claim.Value);
}
}
}
потребление соединения
//project PersonaES..
namespace ServiciosEntidad.PersonaES.Repositorio
{
public class PersonaESRepositorio : DaoConexion, IPersonaESRepositorio
{
public List<Persona> ListarPersonas()
{
DB = DaoConexionDbContext();
DbCommand command = DB.GetStoredProcCommand("spListarPersonas");
DataSet ds = this.DB.ExecuteDataSet(command);
if (ds.Tables[0].AsEnumerable().Count() == 0)
return null;
return ds.Tables[0].AsEnumerable().Select(row => new Persona
{
Tipo = row.Field<string>("Tipo"),
Id = row.Field<int>("Id"),
PrimerNombre = row.Field<string>("PrimerNombre"),
SegundoNombre = row.Field<string>("SegundoNombre"),
PrimerApellido = row.Field<string>("PrimerApellido")
}}}}
img пример.
https://drive.google.com/open?id=1kRv5glvHzsr5vNlvgmsFZW2HlJ7YJqDa
Мое приложение управляет архитектурой SOAP. У меня есть проект с именем: DataAccess
, с классом DaoConexion
. Используя класс базы данных (Microsoft.Practices.EnterpriseLibrary.Data
), который в свою очередь реализует DatabaseFactory.CreateDatabase
, Instancio этот проект в каждом из репозиториев, каждый репозиторий является проектом в рамках одного решения.
Эти проекты внедряются в мой Web API, но у API есть собственная строка подключения. Мое намерение состоит в том, чтобы изменить строку подключения, используемую проектом DataAccess
, в зависимости от текущего подключения веб-API, при выполнении веб-API
//main project Taller (WEB API C#)
namespace Taller.Models
{
public class IdentityContext : IdentityDbContext<IdentityUser>
{
public IdentityContext(string connectionStringName)
: base(connectionStringName)
{
}
public static IdentityContext Create(string connectionStringName)
{
return new IdentityContext(connectionStringName);
}
}
}
Пользователь отправляет имя строки подключения.
//main project Taller (WEB API C#)
namespace Taller.Controllers
{
public class UtilidadController : ApiController
{
[HttpPost]
public string GetConectarDbEmpresa(Empresas empresas)
{
if (empresas.ConnectionStringsName =="")
{
empresas.ConnectionStringsName = "DefaultConnection";
IdentityContext.Create(empresas.ConnectionStringsName);
}
else
{
IdentityContext.Create(empresas.ConnectionStringsName);
}
return "Te as Conectado a la Empresa Por Favor ingresa tus Credenciales: ";
}}}
пользователь уже указал в сеансе входа в систему, какой BD использовать, я не знаю, как временно сохранить connectionStringName, пока у пользователя есть активный сеанс
//main project Taller (WEB API C#)
public partial class Startup{...
public void ConfigureAuth(IAppBuilder app){...
var claims = ((ClaimsIdentity)Thread.CurrentPrincipal.Identity);
var claim = claims.Claims.Where(x => x.Type == "ConnectionStringsName").FirstOrDefault();
if (claim != null)
{
app.CreatePerOwinContext(() => IdentityContext.Create(claim.Value));
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}
else
{
app.CreatePerOwinContext(() => IdentityContext.Create("DefaultConnection"));
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}