Set connectionstring for Membership Service via code - asp.net-membership

I have an ASP.NET web project and a membership provider configured via my web.config. Its fully working so no problem there.
We have an older system with a lot of users and I would therefor like to create a class library that can create users in this ASP.NET project but since its a class library it cannot have its own app.config-file.
is it possible to set all this information via code somehow?
<membership defaultProvider="ShidMembershipProvider">
<providers>
<clear/>
<add name="ShidMembershipProvider" type="SundaHus.AspNet.Membership.ShidMembershipProvider" connectionStringName="ShidConnectionString" enablePasswordRetrieval="true" enablePasswordReset="true" requiersQuestionAndAnswer="true" applicationName="ECB3-development" minRequiredPasswordLength="5"/>
</providers>
</membership>

You have a custom membership provider it looks like? This connects to your own custom database? You should be able to just point to that database for your code. Or, if you just inherit the functionality from the base class, you can also try overriding the Initialize method, look for the connection string, and change the value to something else.

Related

'The ADO.NET provider with invariant name 'Devart.Data.Oracle' is either not registered in the machine or application config file

Ok, there already is a similar issue. It is, however not exactly the same and the solution I got was not derived from the other issue's solution.
Here's my Web.Config setup:
<connectionStrings>
<add name="ADOEntities" connectionString="metadata=res://*/ADOModel.csdl|res://*/ADOModel.ssdl|res://*/ADOModel.msl;provider=Devart.Data.Oracle;provider connection string="User Id=dbUser;Password=*****;Server=oracleserver;Persist Security Info=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
Everything runs fine on my machine (sic), but when I tried to set the ws up on the quality server, I got the error on the title.
I got it working by following the steps in this ADO.NET link. Particularly,
You need to remove the defaultConnectionFactory registration and to add the Entity Framework provider registration by registering it in the entityFramework section
So the line defaultConnectionFactory must go
<entityFramework>
<providers>
<provider invariantName="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity.EF6, Version=9.6.696.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
</providers>
</entityFramework>
Then, add the System.Data section. In my case it looks like this:
<system.data>
<DbProviderFactories>
<remove invariant="Devart.Data.Oracle" />
<add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=9.6.696.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
</DbProviderFactories>
</system.data>
If that still doesn't do the trick for you -- And it didn't for me -- try adding the following line to your context class:
[DbConfigurationType(typeof(Devart.Data.Oracle.Entity.OracleEntityProviderServicesConfiguration))] //Add this line
public partial class ADOEntities : DbContext
You might want to create a partial class, incase you're using ADO, Devart, or other auto-generated entity model, to avoid having this piece of code in an auto-generated class

When SimpleMembershipProvider is not the default provider

When you have multiple membership providers configured, like:
<membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" />
<add name="UsersMembershipProvider" type="umbraco.providers.UsersMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" passwordFormat="Hashed" />
<add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
Then let's say, for a particular section in the site I want to use SimpleMembershipProvider for auth (the rest of the site will use the default provider i.e. UmbracoMembershipProvider) ... Therefore I need to initialize SimpleMembership with:
WebSecurity.InitializeDatabaseConnection(
Constants.Membership.ConnectionStringName,
Constants.Membership.TableName,
Constants.Membership.UserIdColumnName,
Constants.Membership.UserNameColumnName,
false);
But it seems the above code only works when SimpleMembershipProvider is the defaultProvider. I can't see a way to specify the provider name I want to use? Is this even possible? Or does simplymembership assume you have one membership and role provider defined?
SimpleMembershipProvider is an implementation of ExtendedMembershipProvider. Although WebSecurity will work with any implementation of the extended provider it has some questionable coupling to SimpleMembershipProvider if used.
Basically SimpleMembershipProvider requires initialisation via WebSecurity, otherwise it will throw an exception when the extended membership interface is used. If not initialised then it wraps the default ASPNET provider and can be used with the original MembershipProvider Interface and old schema.
The initialisation routine only initialises the default providers, provided they can be cast to the simple provider implementations. So yes you cannot use SimpleMembershipProvider or SimpleRoleProvider unless they are configured as the default instances.
There's some more information about the limitations of SimpleMembershipProvider here.
There is a work-around. You can use reflection to temporarily swap the provider to the default during initialisation and then switch it back. See BetterMembership.Net for an example of doing exactly that. This library extends SimpleMembershipProvider specifically for use in multi-provider systems.
membershipProviderField = typeof(Membership)
.GetField("s_Provider", BindingFlags.NonPublic | BindingFlags.Static);
var originalMembershipProvider = membershipProviderField.GetValue(null);
membershipProviderField.SetValue(null, mySimpleMembershipProvider);
WebSecurity.InitializeDatabaseConnection(...)
membershipProviderField.SetValue(null, originalMembershipProvider);

MVC3 Forms Authentication - going online

I'm using the AuthorizeAttribute and the default forms authentication that comes with the "Internet Application" preset.
Everything is working as it should, but I have some questions about deployment.
I've got this in the web.config:
<connectionStrings>
<add name="AlltForMusikContext" connectionString="Data Source=|DataDirectory|AlltForMusik.sdf" providerName="System.Data.SqlServerCe.4.0"/>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
I tried to get it to use the database in "AlltForMusikContext" but with no success. When I deploy the site, I will only have one (1) SQL-database.
How does this work really? Is the "aspnetdb.mdf" some special db or do I need to get it to use the db in "AlltForMusikContext"?
I couldn't find any relevant info about this, so I would really appreciate your input!
Best regards
Mikael
you are right, your application is having default "aspnetdb.mdf" in you application under "App_Data" folder.
putting AspNetDb.mdf file under application folder is not a good practice rather than you can create a separate database with name and use that. putting your membership database along with your application database does not make good sense.

MVC Custom Membership Provider

I have a custom membership provider that I've specified to be used in my web.config file for an MVC3 project. I assumed that it would be used in place of the built in membership provider since I'm specifying its use like so:
<system.web>
<membership defaultProvider="CustomMySQLMembershipProvider">
<providers>
<clear />
<add
connectionStringName="dbConn"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="25"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
applicationName="/jp2012"
name="CustomMySQLMembershipProvider"
type="NameSpace.CustomMySqlMembershipProvider" />
</providers>
</membership>
</system.web>
Do I have to do something in my code to get it to override the default membership provider? Right now I can access it like this:
CustomMySqlMembershipProvider membership =
(CustomMySqlMembershipProvider)Membership.Providers["CustomMySQLMembershipProvider"];
Is there a way that I can get it to be automagically overriden using the web.config file so I don't have to hardcode my implementations name? Something more like this:
MembershipProvider membership = new MembershipProvider();
Any ideas? Let me know if you need more information.
Your Membership provider is the default provider in your case. You don't need to explicitly cast the provider unless you have additional functionality in your provider.
For example when you call Membership.GetUser() it will call your membership prover's GetUser(...) method.
The issue was actually with how I declared my membership. The line
type="NameSpace.CustomMySqlMembershipProvider"
did not specify the assembly that my custom membership provider was defined in. I right clicked on my project, selected properties, and got the assembly name from the field marked Assembly name.
So if my assembly name was AName, then this line should have been
type="NameSpace.CustomMySqlMembershipProvider, AName"
Thank you #Eranga for attempting to help me out.

publishing Db after creating using EF Code first

I have created a project in MVC 3 using code first and nugget ,
And I would like to clear a few thing before publishing to my shared hosting:
In my project I have a class name: IchudShulContext (IchudShul is my project name)
In my sql server express it has created a DB name: IchudShul.Models.IchudShulContext.dbo
Does it make a different what name I give my shared hosting DB ?
Or should it match one of the following : IchudShul / IchudShulContext
My local connectionStrings look like this :
connectionString="Data Source=MyPc-MAINPC\SQLEXPRESS;Initial Catalog=IchudShul.Models.IchudShulContext;Integrated Security=True"
providerName="System.Data.SqlClient" />
Thanks
Based on Code-First convention, Your ConnectionString name in your web.config should have the same name as your context. Database name is not important. in your scenario, in your web.config:
<connectionStrings>
<add name="IchudShulContext" providerName="System.Data.SqlClient"
connectionString="Data Source=MyPc-MAINPC\SQLEXPRESS;Initial Catalog=WHATEVER_YOUR_DB_NAME_IS;Integrated Security=True" />
</connectionStrings>
If you want to use conventions, make sure the name attribute is: IchudShulContext. That's all. Fill in WHATEVER_YOUR_DB_NAME_IS with whatever you db name is.
Your shared hosting DB can be named anything.
Your ConnectionString should be updated needs to be updated to point to your database. What that is, you will need to know from your shared hosting provider.
you can name you DB anything, as long as it is valid with respect to your DBMS. the only this that should be matched with your datacontext name is connection name in connection strings section of your web.config file.

Resources