MVC Razor无会话身份验证和自定义用户

时间:2013-04-10 09:28:05

标签: asp.net-mvc razor azure forms-authentication

我一直在学习MVC并且正在研究无会话身份验证(减少服务器应变/可扩展性,还因为AppFabric Cache在Azure网站上用于托管会话是昂贵的。)

我的用户信息存储在SQL中,每个用户都有部门,排名,角色和权限(角色/部门也有权限)。我认为我真正需要存储的是他们在安全cookie中的userId,如果它没有过期,则在global.asax中的每个请求中获取其余信息。我会用http://eversystems.eu/Document/15/Sessionless_Authentication_with_Encrypted_Tokens

等方法来保护它

我最终希望能够在我的ViewModel中使用自定义字段对其进行注释

[Authorize(Roles="Admin")] [Authorize(Dept="IT")] [Authorize(Rank="Manager")]

或在Html中说

@if(User.IsInDept("IT")

@if(User.HasRank("Manager"))

我考虑过延伸FormsAthenticationTicketMembership Provider / Roles等以及IPricipalIIdentity等,但很难理解我是如何修改它们以实现我的目标在我之后。我见过的例子有很多我不想要的额外膨胀,但我发现的最好的例子是@Ahmad Abu Raddad ASP.NET MVC - Set custom IIdentity or IPrincipal

如果有人能够指出我是朝着正确的方向前进,还是可能提出替代方案,我会很感激。

1 个答案:

答案 0 :(得分:0)

只想分享我最终解决这个问题的方法。我最终只是创建了一个自定义IPrincipal并公开了我的内部数据库类。

 interface ICustomPrincipal : IPrincipal
{
    //I pass the whole model across so if we update/modify in the future it will automatically populate the new items for the cookie
    user d { get; set; }
   //some other variables
}

我在用户类中设置了大量的方法,如IsInRole(),isInDept(),HasRank(),HasPermission等,它们在查询数据库后返回了一个bool,这给了我所需的视图/控制器中的逻辑。

我创建了一个可以检索这个新的CustomPrincipal

的BaseController
public class BaseController : Controller
{
    protected virtual new CustomPrincipal User
    {
        get { return HttpContext.User as CustomPrincipal; }
    }
}

我还需要更新我的WebViewPage,以便在视图中检索新的CustomPrincipal。

public abstract class BaseViewPage : WebViewPage
{
    public virtual new CustomPrincipal User
    {
        get { return base.User as CustomPrincipal; }
    }

}

并修改我的观点web.config

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="MyNameSpace.BaseViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" /> .....

如果有人发现这个有用,但需要更多信息,请关注我