Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何删除SimpleMembership用户?_Asp.net Mvc_Security - Fatal编程技术网

Asp.net mvc 如何删除SimpleMembership用户?

Asp.net mvc 如何删除SimpleMembership用户?,asp.net-mvc,security,Asp.net Mvc,Security,在使用表单身份验证(通过SimpleMembership)的ASP.NET MVC应用程序中,如何删除用户/帐户 WebSecurity类不公开DeleteUser。在百灵鸟上,我试着: WebSecurity.InitializeDatabaseConnection( "MyDbConnection", "Users", "Id", "UserName", autoCreateTables: true); new SimpleMembershipProvider().DeleteUser

在使用表单身份验证(通过SimpleMembership)的ASP.NET MVC应用程序中,如何删除用户/帐户

WebSecurity类不公开DeleteUser。在百灵鸟上,我试着:

WebSecurity.InitializeDatabaseConnection(
  "MyDbConnection", "Users", "Id", "UserName", autoCreateTables: true);

new SimpleMembershipProvider().DeleteUser(userName, true);
但这会导致我没有初始化SimpleMembership提供程序。在任何情况下,我都会非常感谢一些示例代码,展示如何删除用户。谢谢


Bob

如果您只做
Membership.DeleteUser(用户名,true)
,会发生什么。您可能会得到一个小提示,提示您在
成员资格上添加using指令。如果配置正确,则不需要创建新的SimpleMembershipProvider实例

如果您这样动态创建它,您将需要在该对象上设置连接并以编程方式对其进行配置(它对您上面创建的连接没有任何线索)。通常人们会在web.config中这样做,但是如果您使用表单验证模板创建应用程序,那么您应该自动处理该问题


您的提供商my有一个bug,这里讨论并解决了这个bug:

您可能需要这样的东西:

    //
    // GET: /Members/Delete?userName=someuser

    public ActionResult Delete(string userName)
    {
        var user = context.UserProfiles.SingleOrDefault(u => u.UserName == userName);
        return View(user);
    }

    //
    // POST: /Members/Delete?userName=someuser

    [HttpPost]
    public ActionResult Delete(string userName, FormCollection collection)
    {
        try
        {
            // TODO: Add delete logic here
            ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
            ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table

            return RedirectToAction("Index");
        }
        catch
        {
            return View(userName);
        }
    }
[HttpPost]
public ActionResult Delete(string userName, FormCollection collection)
{
    try
    {
        // TODO: Add delete logic here
        if (Roles.GetRolesForUser(userName).Count() > 0)
        {
            Roles.RemoveUserFromRoles(userName, Roles.GetRolesForUser(userName));
        }
        ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
        ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table

        return RedirectToAction("Index");
    }
    catch
    {
        return View(userName);
    }
}

PussInBoots是绝对正确的,尽管如果已删除的用户已添加到任何角色,这总是会对我抛出外键约束冲突。我确信这是由PussInBoots的//TODO:Add-delete-logic-here”注释推断出来的,但我通常会先清理角色成员身份,如下所示:

    //
    // GET: /Members/Delete?userName=someuser

    public ActionResult Delete(string userName)
    {
        var user = context.UserProfiles.SingleOrDefault(u => u.UserName == userName);
        return View(user);
    }

    //
    // POST: /Members/Delete?userName=someuser

    [HttpPost]
    public ActionResult Delete(string userName, FormCollection collection)
    {
        try
        {
            // TODO: Add delete logic here
            ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
            ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table

            return RedirectToAction("Index");
        }
        catch
        {
            return View(userName);
        }
    }
[HttpPost]
public ActionResult Delete(string userName, FormCollection collection)
{
    try
    {
        // TODO: Add delete logic here
        if (Roles.GetRolesForUser(userName).Count() > 0)
        {
            Roles.RemoveUserFromRoles(userName, Roles.GetRolesForUser(userName));
        }
        ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table
        ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table

        return RedirectToAction("Index");
    }
    catch
    {
        return View(userName);
    }
}

嘿,我只是想为在遵循PussInBoots示例后遇到ObjectContext状态问题的任何人发布此消息,因为我也有同样的问题

如果要访问其他用户数据,则需要使用以下方法将该用户从数据上下文中删除:

context.Users.Remove(user);
而不是:

((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true);

这将使您的EF上下文保持最新,并将用户从数据库中删除。

我在运行单元测试时从Membership.DeleteUser获得异常System.NotSupportedException。问题是app.config将“DefaultProvider”设置为“ClientAuthenticationMembershipProvider”,如您所见,它“未被此类使用”

修复方法是更新我的app.config以匹配我的web.config,并正确配置默认提供程序:

<membership>
    <providers>
        <clear />
            <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="Crelate.Properties.Settings.DatabaseMembershipServicesConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
        </providers>
    </membership>


它抛出NotSupportedException:不支持指定的方法。我不知道NotSupportedException是关于什么的。我可能没有正确初始化SimpleMembership鼓掌。经过多次尝试和错误,我想我已经很高兴地完成了所有部分(代码优先迁移和SimpleMembership),现在Membership.DeleteUser可以很高兴地工作了。Bob.at.SBS请参阅下面的评论,这意味着该类正在访问一个未实现该方法的提供程序。关于DeleteUsers的MSDN文档说:“此方法删除成员帐户表中的条目(默认情况下为webpages\u membership)。”这对我不起作用。我必须先调用DeleteAccount(删除webpages\u membership中的记录),然后调用DeleteUser(删除我的Users表中的记录)。请参阅osiris97的答案。DeleteUser:没有遇到约束冲突,因此添加操作异常。“TODO:在此添加删除逻辑”“评论是由我在Visual Studio中创建的默认MVC应用程序自动生成的。@我同意。非常好的解决方案,谢谢osiris97I,我喜欢你得到颗粒控制。。。但也许应该有另一种方法,叫做EXPUNGEANDESTRODEANDERADicateUser(字符串用户名);这就是所有这些。我想这就是我在代码+1Membership.Provider.DeleteUser(userName,true)中要说的,它不需要强制转换,而Membership.Provider.DeleteAccount(userName)需要强制转换。osiris97的答案在角色处理方面更完整。检查一下。