asp.net-mvc - mvc.net中如何实现安全认证和角色机制?

标签 asp.net-mvc security asp.net-roles

我正在尝试在我的第一个 mvc 应用程序中实现角色机制,因此我可以使用 actionResults 上方的数据注释 ([Authorize(Roles="Administrator")])..

我阅读了很多关于安全身份验证、成员资格和角色的内容,但仍然无法解决所有这些问题。例如,我在这里读到:

http://stackoverflow.com/questions/10742709/asp-net-mvc4-security-authentication-and-authorization

甚至试图复制以下内容:
http://www.codeproject.com/Articles/654846/Security-In-ASP-NET-MVC

我实现了 roleProvider 和 AccountMembershipProvider 接口(interface),但我必须在这里遗漏一些重要的东西,因为它不工作..

我需要一个很好的教程,说明我需要实现什么以及如何将所有内容结合起来。

你能解释一下如何实现吗?

最佳答案

我不久前建立了这个教程..
它结合了来自几个来源的一些现有教程。所以,也许你已经看到了其中的一部分。

为了让它工作,您必须在您的应用程序中实现以下所有代码。

让我们开始:

当您的应用程序 web.config 文件在 <system.web> 下具有以下部分时,将激活数据注释机制标签:

  <system.web>

    <!-- authentication section activates the auth system -->

    <authentication mode="Forms">
       <forms loginUrl="~/yourLoginControllerName/YourLoginActionResult" timeout="2880" />
    </authentication>

    <!-- membership section defines which class is used to check authentication, in this example, this is the default class -->

    <membership defaultProvider="AccountMembershipProvider">
      <providers>
        <clear/>
        <add name="AccountMembershipProvider"
             type="yourProjectName.Web.Infrastructure.AccountMembershipProvider" />
      </providers>
    </membership>

    <!-- roleManager section defines which class is used to check roles for users, in this example, the default class is used -->

    <roleManager enabled="true" defaultProvider="AccountRoleProvider">
      <providers>
        <clear/>
        <add name="AccountRoleProvider"
             type="yourProjectName.Web.Infrastructure.AccountRoleProvider" />
      </providers>
    </roleManager>
..
  </system.web>

装饰允许您控制哪些角色可以访问哪些 Controller 操作,并定义 Controller 操作是需要身份验证才能访问它们还是可以被所有用户访问。控制由 Controller 中的以下属性完成,例如:
public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index()
    {
..
    }

    [Authorize(Roles = "Administrator, KingOnRails")]
    public ActionResult Edit(int Id)
    {
..
    }

默认系统限制您按原样使用数据注释。它需要数据库连接来创建用户表和角色。

下面向您展示如何覆盖它并将成员资格和角色管理类替换为简单的类,这些类可以使用您自己的 3rd 方库对用户进行身份验证并赋予他们角色。

您需要实现以下 2 个类,为了提高可读性,请将它们放在解决方案中的同一文件夹中:
public class AccountMembershipProvider : MembershipProvider
{
        public override bool ValidateUser(string username, string password)
        {
            if (username == "KingOnRails")
                return true;
            return false;
        }
}

和:
public class AccountRoleProvider : RoleProvider
{

        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
                //Here you can implement insertion of <key, value> = <user, role> to a global dictionary maintained in Global.asax file... 
        }

        public override string[] GetRolesForUser(string username)
        {
            if (username == "Roy Doron")
                return new string[1] { "User" };
            else if (username == "KingOnRails")
                return new string[1] { "Administrator" };
            return null;
        }

        public override bool RoleExists(string roleName)
        {
            if ((roleName == "Administrator") || (roleName == "User"))
                return true;
            else
                return false;
        }
}

就是这样.. 现在您只需在登录 Controller 中编写自己的流程(如果有),如果没有,则需要实现一个登录页面。

当用户尝试登录到您的系统时,登录 Controller 应调用成员资格 ValidateUser() 方法,如果成功,则需要为该用户创建 Web 表单例份验证票,然后将用户重定向到您想要的任何位置,例如:
[HttpPost]
public ActionResult Login()
        {
            string user = Request.Params["user"];
    // calls the AccountMembershipProvider.ValidateUser()
            if (Membership.ValidateUser(user, Request.Params["password"]))
            {
                FormsAuthentication.SetAuthCookie(user, true);
                return Redirect("/Home/WhereEver");
            }
            else
                return Redirect("/Home/Login");

        }

就这些了,希望对你有帮助。

如果您有任何其他问题,请随时提出。

祝你好运。

关于asp.net-mvc - mvc.net中如何实现安全认证和角色机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29252571/

相关文章:

asp.net-mvc - Controller 类中授权角色的继承

mysql - 如何让 ASP.NET 角色使用 MySQL?

ASP.NET MVC 中的 JQuery Datatable 插件数据绑定(bind)

asp.net-mvc - 模型内部属性的自定义模型绑定(bind)器

security - OWASP ZAP。如何使用cookie来扫描网站?

Java EE Web 应用防火墙

security - Linux 系统调用和内核模式

mysql - 部署 - 带有 Entity Framework 的 MySQL

asp.net-mvc - 如何在 Razor MVC 中为共享布局提供模型?

asp.net-mvc - GenericPrincipal 角色在 MVC View 中不可用