我正在尝试向 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/