asp.net-mvc - ASP.NET MVC 表单例份验证 + 授权属性 + 简单角色

标签 asp.net-mvc forms-authentication authorization

我正在尝试向 ASP.NET MVC 应用程序添加简单身份验证和授权。

我只是想在基本表单例份验证中添加一些附加功能(由于简单性和自定义数据库结构)

假设这是我的数据库结构: 用户: 用户名 密码 角色(最好是一些枚举。如果需要的话可以是字符串。目前,用户只有一个角色,但这可能会改变)

高级问题: 鉴于上述数据库结构,我希望能够执行以下操作:

  • 使用表单例份验证进行简单登录
  • 用以下内容装饰我的行为: [授权(角色={ MyRoles.Admin, MyRoles.Member})]
  • 在我的 View 中使用角色(以确定在某些部分中显示的链接)

目前,我真正确定的是如何进行身份验证。之后我就迷路了。我不确定在哪一点获取用户角色(登录、每次授权?)。由于我的角色可能不是字符串,因此我不确定它们如何与 User.IsInRole() 相适应。

现在,我在这里问是因为我还没有找到一个“简单”的方法来完成我的需要。我见过很多例子。

对于身份验证:

  • 我们有简单的用户验证来检查数据库和“SetAuthCookie”
  • 或者我们重写成员(member)资格提供程序并在 ValidateUser 内部执行此操作 在这两种情况下,我不确定如何添加我的简单用户角色,以便它们可以使用: HttpContext.Current.User.IsInRole("管理员") 此外,我不确定如何修改它以与我的枚举值一起使用。

对于授权,我见过:

  • 派生 AuthorizeAttribute 并实现 AuthorizeCore 或 OnAuthorization 来处理角色?
  • 实现 IPrincipal?

任何帮助将不胜感激。不过,我担心我可能需要很多细节,因为我在 Google 上搜索到的内容似乎都不符合我需要做的事情。

最佳答案

我想我已经实现了类似的东西。
我的解决方案,基于NerdDinner tutorial ,如下。

当您登录用户时,添加如下代码:

var authTicket = new FormsAuthenticationTicket(
    1,                             // version
    userName,                      // user name
    DateTime.Now,                  // created
    DateTime.Now.AddMinutes(20),   // expires
    rememberMe,                    // persistent?
    "Moderator;Admin"                        // can be used to store roles
    );

string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

将以下代码添加到Global.asax.cs:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null || authCookie.Value == "")
        return;

    FormsAuthenticationTicket authTicket;
    try
    {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    }
    catch
    {
        return;
    }

    // retrieve roles from UserData
    string[] roles = authTicket.UserData.Split(';');

    if (Context.User != null)
        Context.User = new GenericPrincipal(Context.User.Identity, roles);
}

完成此操作后,您可以使用 [Authorize] Controller 操作代码中的属性:

[Authorize(Roles="Admin")]
public ActionResult AdminIndex ()

如果您还有其他问题,请告诉我。

关于asp.net-mvc - ASP.NET MVC 表单例份验证 + 授权属性 + 简单角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385042/

相关文章:

c# - 如何确定 ASP.NET MVC Post 中使用的编码?

c# - 如何避免在 C# MVC 中将 & 号 (&) 转换为 &amp

security - 授权系统设计题

javascript - 授权 MVC3 ASP.NET

具有基本授权和重定向的 Java Http POST

jquery - AngularJS Datatables 使用 SignalR 获取数据

ASP.NET Forms 身份验证需要启用匿名

asp.net-mvc - 在 ASP.NET MVC 中混合使用 Windows 和 Forms 身份验证

SharePoint (MOSS 2007) 成功的表单例份验证重定向到计算机名称

c# - 将 ASP.Net Identity DbContext 与我的 DbContext 合并