[英]ASP.NET MVC 3 Custom Authentication/Authorization
我在互聯網上搜索過,所以我在這個主題上找到了一些好東西,但是我還有一些問題,我仍然不確定:
1)我正在使用自定義身份驗證提供程序的表單身份驗證。 所以我仍然使用Authorize
屬性和web.config中的部分,但基本上當FormsAuthenticationTicket
不存在時,我重定向到登錄頁面(在web.config中指定),然后利用自定義身份驗證提供程序來授權用戶對數據庫然后發出FormsAuthenticationTicket
。 這個對嗎?
2)我應該使用自定義Authorize
屬性還是應該從Global.asax頁面中的Application_AuthenticateRequest
事件處理程序中將GenericPrincipal
注入HttpContext
? 或者我應該使用控制器操作的User.IsInRole
insode?
我只需要基於角色的授權,我認為我的身份驗證方案非常好。
任何指針/建議?
謝謝,山姆
編輯
因此,根據我的閱讀,最好的選擇是創建自定義AuthorizeAttribute
並覆蓋AuthorizeCore
。
所以我做的是這樣的:
public class CustomAuthorize : System.Web.Mvc.AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.User.Identity.IsAuthenticated)
{
var model = AdminUserViewModel.FromJsonString(((FormsIdentity)httpContext.User.Identity).Ticket.UserData);
httpContext.User = new GenericPrincipal(HttpContext.Current.User.Identity, model.SecurityGroups.Select(x => x.Name).ToArray());
}
return base.AuthorizeCore(httpContext);
}
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
//base.HandleUnauthorizedRequest(filterContext);
filterContext.Result = new System.Web.Mvc.RedirectResult("/Authentication/NotAuthorized", false);
}
}
只需使用存儲在FormsAuthenticationTicket
UserData
屬性中的角色注入新的主體/標識。 然后讓基地完成剩下的工作。
這看起來好嗎?
編輯#2
我對使用IIS7的global.asax中的Application_AuthenticateRequest
感到有點厭倦,因為集成管道,每個請求都會觸發該事件,圖像,css,js ......
這個對嗎?
1)我做同樣的事情。
2)我使用Authorize屬性和Application_AuthenticateRequest事件處理程序。
在Application_AuthenticateRequest事件處理程序中,我執行以下操作:
string[] roles = authenticationTicket.UserData.Split(',');
if (Context.User != null)
Context.User = new GenericPrincipal(Context.User.Identity, roles);
在控制器或動作級別,我做這樣的事情:
[Authorize(Roles = "Admin, SuperAdmin")]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.