在开发具有成员资格功能的站点时,大多数人是否使用.NET的SqlMembershipProvider,SqlRoleProvider和SqlProfileProvider?
或者许多人完全建立自己的提供者,甚至自己的会员制度?
SQL提供程序的哪些限制会让您自己推出?
是否可以轻松扩展SQL提供程序以提供其他功能?
对于Reference
Per Scott Gu的博客,Microsoft提供了SqlMembershipProvider的源代码,以便您可以自定义它,而不是从头开始.只是一个FYI.
c# asp.net sqlmembershipprovider sqlroleprovider sqlprofileprovider
Asp.Net MVC 1.0项目模板包含一个AccountController类,它支持构造函数注入:
public AccountController(IFormsAuthentication formsAuth,
IMembershipService service)
{
FormsAuth = formsAuth ?? new FormsAuthenticationService();
MembershipService = service ?? new AccountMembershipService();
}
Run Code Online (Sandbox Code Playgroud)
一个AccountMembershipService类也包括在内,而且它也支持构造器注入:
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
Run Code Online (Sandbox Code Playgroud)
我相信你们中的许多人已经将这些用于单元测试,但我的目标是使用Windsor 注入一个SqlMembershipProvider,因此使用Windsor xml文件而不是web.config在运行时配置它.换句话说,我想实际使用AccountMembershipService类的构造函数注入,我想继续使用内置的ASP.Net 2.0 Membership系统.我只想让会员系统的配置通过Windsor IoC.
如果没有编写我自己的MembershipProvider,或者SqlMembershipProvider不能很好地与IoC一起使用,这是否可行?
来自MSDN:"ASP.NET调用SqlMembershipProvider构造函数来创建应用程序配置中指定的SqlMembershipProvider类的实例.此构造函数不应在您的代码中使用."
我相信菲尔提出了一个非常相似的问题,但我没有足够的经验来解决他收到的答案.
谢谢你的帮助.
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Mike Hadlow 在这里讨论这种技术. 我只是想将SqlMembershipProvider集成到他对这个IoC设计的使用中.
再次感谢.
asp.net-mvc dependency-injection castle-windsor asp.net-membership sqlmembershipprovider
我是asp.net会员新手,我需要帮助以编程方式更改其连接字符串.
我到现在为止尝试的是
我已经创建了一个类项目名称Sample作为名称空间**并扩展了 System.Web.Security.SqlMembershipProvider
代码为
namespace Sample
{
public class Connectionstring : SqlMembershipProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
string connectionString = "server=xx.xx.xx;database=db;user id=un;password=pwd";
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType
.GetField("_sqlConnectionString", BindingFlags.Instance |
BindingFlags.NonPublic);
connectionStringField.SetValue(this, connectionString);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并将成员标记中的Web配置文件更改为
<membership defaultProvider="SQLMembershipProvider">
<providers>
<add name="SQLMembershipProvider" type="sample.Connectionstring,sample" connectionStringName="SQLMembershipConnString" applicationName="@@@@@@@" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" />
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
并且在运行Web应用程序项目时,我正在更改的连接字符串不会被更改?
等待您的宝贵回复和评论
我正在尝试使用SQL Azure数据库将SimpleMembership与MVC4一起使用.
我得到一个例外
The Provider encountered an unknown error.
Run Code Online (Sandbox Code Playgroud)
没有内部异常,在这行代码上:
WebSecurity.CreateAccount("test@test.com", "23iu$9835", false);
Run Code Online (Sandbox Code Playgroud)
我的控制器上有这个过滤器
[InitializeSimpleMembership]
Run Code Online (Sandbox Code Playgroud)
其中包含此InitializeDatabaseConnection
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "User", "Id", "Email", autoCreateTables: false);
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查了我的连接字符串,它似乎工作正常.
由于异常没有提供有用的信息,因此我很难调试此问题.有没有人有任何想法,为什么我可能有这个问题,或指出我正在开始调试问题的正确方向?
编辑:这是完整的堆栈跟踪:
[MembershipCreateUserException: The Provider encountered an unknown error.]
WebMatrix.WebData.SimpleMembershipProvider.CreateAccount(String userName, String password, Boolean requireConfirmationToken) +514
WebMatrix.WebData.WebSecurity.CreateAccount(String userName, String password, Boolean requireConfirmationToken) +75
Nexus.Areas._Internal.Controllers.HomeController.Index() in c:\54Projects\Nexus\Nexus\Areas\_Internal\Controllers\HomeController.cs:38
lambda_method(Closure , ControllerBase , Object[] ) +101
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +59
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +435
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +60
System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeSynchronousActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +50 …Run Code Online (Sandbox Code Playgroud) asp.net-mvc asp.net-membership sqlmembershipprovider asp.net-mvc-4 simplemembership
这个问题 ,如果我使用GUID Membership.GetUser工作正常,但如果我尝试不带参数或名称失败:
//This works and adds records to aspnet_user & aspnet_Membership tables
MembershipUser membershipUser = Membership.CreateUser(_name, _pwd, _email, null, null, true, null, out createStatus);
//These fail with an InvalidCastException
MembershipUser membershipUser2 = Membership.GetUser(_name, true);
MembershipUser membershipUser3 = Membership.GetUser();
//If I go look up the GUID for this user (userId), this works!
MembershipUser membershipUser4 = Membership.GetUser(new Guid("E1428CD3-CF17-494E-AB77-CF8F6010F585"), true);
Run Code Online (Sandbox Code Playgroud)
其他之谜
//This works
Int32 count = Membership.GetNumberOfUsersOnline();
//this fails (but totalRecords has the right value)
Int32 totalRecords;
MembershipUserCollection col = Membership.GetAllUsers(0,100, out …Run Code Online (Sandbox Code Playgroud) .net c# asp.net-mvc exception-handling sqlmembershipprovider
我有一个旧的ASP.NET应用程序,它使用SQL Membership并使用aspnet_ tables来管理登录,密码和角色等.
我想使用MVC 5重写应用程序,但它使用ASP.NET身份,我还没有找到一种使用新身份验证方法迁移到它的简单方法.
我尝试了http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity, 但这似乎并不起作用尽管全部SQL脚本执行得很好.
在尝试创建一个全新的ASP.NET MVC 5应用程序时,我无法将其绑定到我当前的数据库中.我尝试将DB Context连接字符串设置为我的实体框架连接字符串,但它不喜欢这样.
有没有人有经验将旧的.NET应用程序迁移到MVC 5并保留用户数据库?
asp.net migration asp.net-mvc identity sqlmembershipprovider
Visual Studio 2005附带了一个项目,允许您使用asp.net成员资格提供程序来查找,添加,编辑和删除用户和角色.不幸的是,它无法在线使用,并且为了在您的站点中拥有管理区域,您似乎必须编写自己的管理界面.
是否有一个开源或免费项目具有netwebadmin的功能,但可以在线使用?
我有一个SQL脚本,可以在我的数据库中创建用户.它使用.Net成员资格存储过程.
此时它工作正常.
唯一的问题是密码保存为明文.我应该在这里更改为他们是盐渍/加密的(不知道在这里使用什么术语)
GO
DECLARE @return_value int,
@UserId uniqueidentifier
EXEC @return_value = [dbo].[aspnet_Membership_CreateUser]
@ApplicationName = N'Theater',
@UserName = N'sam.sosa',
@Password = N'mypassword',
@PasswordSalt = N'eyhKDP858wdrYHbBmFoQ6DXzFE1FB+RDP4ULrpoZXt6f',
@Email = N'sam@Simple.com',
@PasswordQuestion = N'Whats your favorite color',
@PasswordAnswer = N'Fusia',
@IsApproved = 1,
@CurrentTimeUtc = '2010-03-03',
@CreateDate = '2010-03-03',
@UniqueEmail = 1,
@PasswordFormat = 0,
@UserId = @UserId OUTPUT
SELECT @UserId as N'@UserId'
SELECT 'Return Value' = @return_value
GO
Run Code Online (Sandbox Code Playgroud)
谢谢!
asp.net-membership sqlmembershipprovider membership-provider
我是ASP.NET的新手,刚刚开始学习ASP.NET MVC 3.我使用默认模板启动了一个新的ASP.NET MVC 3项目,该模板已经配置了大部分成员资格.现在我正试图了解幕后的真实情况.
我发现默认模板定义了一个IMembershipService接口,该接口由AccountMembershipService类实现,它基本上只包装System.Web.Security.MembershipProvider.从代码中的注释听起来像这样的抽象是为了便于单元测试.
默认的MembershipProvider在Web.config文件中设置.我的项目是从默认模板创建的,它被设置为SqlMembershipProvider.
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
它引用Web.config文件中的连接字符串,该文件引用SQL Express数据库"aspnetdb.mdf".
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
当我第一次创建项目时,没有aspnet.mdf文件.但在运行我的应用程序并注册新用户后,此文件自动生成表格和所有.这里发生了什么?是什么创建了这个文件并指定了应该创建的表?
您将如何使用以下代码解决并发问题?在此示例中,我们想知道用户验证失败的原因.问题是这段代码对数据库进行了两次单独的调用,但我们希望整个方法在概念事务中发生.具体来说,我们对隔离感兴趣.在确定身份验证失败的原因之前,我们不希望在执行此方法期间并发写入会影响我们的读取.
我想到了一些解决方案:Thread Locking,TransactionScope和Optimistic Locking.我非常喜欢乐观锁定的想法,因为我认为冲突可能很少见,但是.NET没有内置任何东西,对吧?
此外 - 在这种情况下,这真的是值得关注的吗?什么时候这样的并发问题很重要,什么时候不重要?在实施解决方案时需要考虑什么?性能?锁的持续时间?冲突发生的可能性有多大?
编辑:在回顾Aristos的回答之后,我认为我真正追求的是Authenticate方法的某种" 快照 "隔离级别.
public MembershipStatus Authenticate(string username, string password)
{
MembershipUser user = Membership.GetUser(username);
if (user == null)
{
// user did not exist as of Membership.GetUser
return MembershipStatus.InvalidUsername;
}
if (user.IsLockedOut)
{
// user was locked out as of Membership.GetUser
return MembershipStatus.AccountLockedOut;
}
if (Membership.ValidateUser(username, password))
{
// user was valid as of Membership.ValidateUser
return MembershipStatus.Valid;
}
// user was …Run Code Online (Sandbox Code Playgroud)