我一直在学习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"))
我考虑过延伸FormsAthenticationTicket
和Membership Provider / Roles
等以及IPricipal
和IIdentity
等,但很难理解我是如何修改它们以实现我的目标在我之后。我见过的例子有很多我不想要的额外膨胀,但我发现的最好的例子是@Ahmad Abu Raddad ASP.NET MVC - Set custom IIdentity or IPrincipal
如果有人能够指出我是朝着正确的方向前进,还是可能提出替代方案,我会很感激。
答案 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
的BaseControllerpublic 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" /> .....
如果有人发现这个有用,但需要更多信息,请关注我