我在最后一两天做了一些事情来破坏我的申请。
我有一种使用会员资格提供程序在会员资格数据库中创建新用户的方法。
例如
public void Create(Consumer consumer)
{
MembershipCreateStatus status;
if (consumer.UserId == Guid.Empty)
{
consumer.UserId = Guid.NewGuid();
}
if (consumer.ConsumerId == Guid.Empty)
{
consumer.ConsumerId = Guid.NewGuid();
}
try
{
var membershipUser = Membership.CreateUser(consumer.UserName, consumer.Password, consumer.Email, null, null, consumer.IsApproved, consumer.UserId, out status);
....
}
Run Code Online (Sandbox Code Playgroud)
内部异常是
{“对象名称‘dbo.Memberships’无效。”}
堆栈跟踪是
在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand实体命令,CommandBehavior行为)在System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext上下文,ObjectParameterCollection参数值)在System.Data.Objects.ObjectQuery
1.GetResults(Nullable1 forMergeOption)在 System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 源)在 System.Data.Objects.ELinq.ObjectQueryProvider.b__1[TResult](IEnumerable1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable1 查询,表达式 queryRoot) 在 System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider .Execute[S](Expression 表达式) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source) at System.Web.Providers.QueryHelper.GetMembership(MembershipEntities ctx, String applicationName, Guid userId) …
我正在尝试在 ASP.NET MVC4 应用程序中实现表单身份验证,我只有一个用户将通过身份验证来执行一些管理活动。
<authentication mode="Forms">
<forms timeout="2880" loginUrl="~/Admin/Login" slidingExpiration="true">
<credentials passwordFormat="Clear">
<user name="user" password="password"/>
</credentials>
</forms>
</authentication>
Run Code Online (Sandbox Code Playgroud)
当我尝试使用该FormsAuthentication.ValidateUser方法时,我收到一个过时的警告,我应该使用 nowMembership类。
我的问题是如何在 web.config 中配置成员资格提供程序以使用 web.config 中的凭据设置?我应该在name属性中指定什么提供者?
我正在开发从遗留的ASP.NET表单应用程序到MVC 4应用程序的迭代迁移.
此迁移分阶段进行,一次一个部分,因此有必要同时运行旧版和新版MVC应用程序.对于某些部分,用户将被定向到新应用程序,对于尚未迁移的部分,用户将被定向回(或保留在)旧应用程序上.
在服务器上,应用程序的结构如下:
LEGACY (.NET 2.0 forms app)--
|--Api (new MVC 4 WebAPI)
|--V2 (new MVC 4)
Run Code Online (Sandbox Code Playgroud)
所以foo对遗留页面的调用就是/foo.aspx在V2上/V2/foo.
一切都在C#中,但请注意遗留应用程序在.NET 2.0上运行,V2应用程序在.NET 4.5上运行.我不确定这是否重要,但认为重要的是要注意.
我无法在应用程序之间成功共享用户/身份验证状态.显然,如果用户登录对遗留应用程序,我需要抓住他们的权威性的cookie(或采取类似行动)的V2的应用程序时,V2页面被调出,使用户不会再次提示您登录.
我已经设置相同authentication,并machinekey在这两个Web.config文件中的元素:
<authentication mode="Forms">
<forms cookieless="UseCookies" defaultUrl="~/someUrl" loginUrl="/" path="/" protection="All" timeout="240" enableCrossAppRedirects ="true" domain="someDomain.com" requireSSL="false" />
</authentication>
<machineKey validationKey="DE78CF63226. . .788658D142AB881" decryptionKey="0B97E8BA4C4EB4B4C524. . .54E4622E14168D2D5C84461FA2" validation="SHA1" decryption="AES" />
Run Code Online (Sandbox Code Playgroud)
我在V2应用程序的Global.asax中尝试了这段代码:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName]; …Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc forms-authentication membership-provider
如何从空的ASP.NET MVC 4模板开始配置简单成员资格提供程序?
我在谷歌,必应和其他许多人上搜索了很多,但我对会员提供商没有得到任何积极的回应.
有人可以告诉我简单会员提供者的基本知识吗?
asp.net-membership membership-provider asp.net-mvc-4 simplemembership
是否可以获取用户密码?请问如何?当我尝试这段代码时:
WebSecurity.InitializeDatabaseConnection("nectarys-pc.MonitoringN.dbo", "Superviseur", "UserId", "matricule", autoCreateTables: true);
var membership = (SimpleMembershipProvider)Membership.Provider;
model.motDePasse = membership.GetUser(superviseur.matricule, false).GetPassword();
Run Code Online (Sandbox Code Playgroud)
此异常出现在最后一行:
System.NotSupportedException:不支持指定的方法。
该如何处理?
请注意,这superviseur.matricule不是问题的根源。
asp.net-mvc entity-framework membership-provider asp.net-mvc-4 simplemembership
我非常接近完成这个项目.我需要从我的Membership表中检索密码和passwordSalt,以将其与我的'OldPasswords'表进行比较.
问题是成员资格提供程序不允许我使用GetPassword方法,因为密码是经过哈希处理的.
我无法在正常的sqlConnection中检索它,因为UserID也被哈希处理.
有谁知道如何散列UserID所以我可以把它放在我的where子句中?
或者可能有不同的方式来获取这些数据?
任何帮助表示赞赏.
谢谢,
史蒂夫
我在一个站点上处理多个成员提供商时遇到问题.
我有一个注册页面,用于创建用户并将其添加到AD域.在我有一个会员提供者之前,我打过电话
Membership.CreateUser(txtUsername.Text, txtPassword.Text)
Run Code Online (Sandbox Code Playgroud)
根据页面上的用户输入创建用户名.
但是,我在web.config中添加了另一个成员资格提供程序,以便可以使用登录页面从另一个AD登录.现在,我的注册页面不起作用,因为(我假设)有两个会员提供商?
我怎样才能解决这个问题?如何在调用Membership.CreateUser时指定要使用的提供程序?
谢谢.
编辑:
如下所述,正确的方法是:
MembershipCreateStatus newStatus = new MembershipCreateStatus();
Membership.Providers["ProviderName"].CreateUser(txtUserName.Text, txtPassword.Text, null, null, null, true,null, out newStatus);
Run Code Online (Sandbox Code Playgroud)
谢谢!
因此,在使用.NET Membership系统的MVC中,密码策略在web.config文件中定义.例如,minPasswordLength在membership - >配置文件中定义.
使用View时,可以使用该@Membership组件访问它
Passwords must be at least @Membership.MinRequiredPasswordLength characters long.
Run Code Online (Sandbox Code Playgroud)
但是,如果您查看示例MVC应用程序中的默认模型,它会说
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New Password")]
public string NewPassword { get; set; }
Run Code Online (Sandbox Code Playgroud)
我很好奇的部分是MinimumLength = 6因为这是硬编码的,这意味着如果我想更新密码长度,我不仅要编辑web.config(如Microsoft建议),还要搜索任何引用它在源头并在各处变化(可能不是最好的编程实践).
有没有在Attributes中使用变量的方法.我怀疑不是因为这可能发生在编译时而不是运行时.如果没有人知道更好的模式,以阻止我在将来找到替换所有引用?
当我尝试Membership.DeleteUser(string, bool)使用SimpleMembership提供程序的MVC 4项目时,我收到以下错误消息:
"DELETE语句与REFERENCE约束"fk_UserId"冲突.冲突发生在数据库"Conductor_Basic3",表"dbo.webpages_UsersInRoles",列'UserId'.该语句已被终止."
约束已设置且正确,因此我无法真正理解错误消息.我想我在这里错过了一些东西.
任何人都可以向我解释这个错误吗?
我如何模拟我的会员提供者(我有自定义会员提供者,但不知道如何模拟它并将会员资格作为提供者提供为Membership.Provider只有getter)并在我的单元测试中使用该模拟的自定义成员资格提供者?
这是我的控制器
public class MyController
{
private IMyRepository myRepository;
public MyController(IMyRepository myRepository)
{
this.myRepository= myRepository;
}
[HttpGet]
public ActionResult Create()
{
var user = Membership.GetUser(); // <--- I want mock this method
ViewBag.User = user;
return View("Create");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试(使用Moq)
[TestClass]
public class MyControllerUnitTest
{
private MyController controller;
public MyControllerUnitTest()
{
Mock<IMyRepository > myRepository = new Mock<IMyRepository>();
var controller = new GroupController(myRepository.Object);
}
[TestMethod]
public void TestMethod1()
{
var result = controller.Create() as ViewResult;
Assert.AreEqual("Create", result.ViewName);
}
}
Run Code Online (Sandbox Code Playgroud)