3

我有一个 ASP.Net MVC 内部网站,它使用 Windows 身份验证来了解谁登录(不允许匿名浏览)。当用户第一次访问时,我从他们那里收集了一些非常基本的信息,用于他们的联系人对象(例如姓名、电子邮件、国家/地区),然后将这些信息存储在应用程序数据库中。

我想让站点角色基于,所以我需要能够为每个用户分配一个角色(用户、管理员等)。我可以使用 ADS 组来做到这一点,但这似乎相当重量级。我可以使用 ASP.Net 提供的 SQL Membership 服务来存储他们的用户名以及他们所属的角色,还是我会被迫收集密码等(违背了使用 Windows 身份验证的要点)?这是否也与 ASP.Net MVC [Authorize] 属性集成?

4

2 回答 2

7

在“正常”的 ASP.NET 中当然可以使用这种组合(Windows 身份验证和 SQL for Roles),因此 MVC 也应该可以。

这是一个可能有帮助的链接

于 2009-05-20T14:58:32.797 回答
2

是的,你可以这样做。

Authorize 使用 IPrincipal 的 IsInRole 方法来确定用户是否属于给定角色。

您可以在 Global.asax 中的 AuthenticateRequest 事件期间切换 IPrincipal 的默认实现,并使用您的实现方式来处理它。

以下是一些示例代码,它们可能实际上可以工作和编译,并且不会让您的网站受到黑客的攻击:

private void Application_AuthenticateRequest(object sender, EventArgs e)
{
    if (!Request.IsAuthenticated)
    {
        Context.User = new MyPrincipal { Identity = new MyIdentity 
                { Type = UserType.Inactive, Id = int.MinValue }};
        Thread.CurrentPrincipal = Context.User;
    }
    else
    {
        HttpCookie authCookie = Request.Cookies[
            FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket =
                   FormsAuthentication.Decrypt(authCookie.Value);

            var identity = Db.GetIdentity(
              authTicket.Name, new HttpRequestWrapper(Request));
        Context.User = new MyPrincipal { Identity = new MyIdentity 
                { Type = UserType.Inactive, Id = int.MinValue }};
        Thread.CurrentPrincipal = Context.User;
        }
    }
}
于 2009-05-20T15:02:15.457 回答