這允許「frankl」訪問但阻止管理員。我做錯了什麼?MVC3 AuthorizeAttribute
[Authorize(Order=1,Roles = "Admin",Users="frankl")]
public class AuthorizeBaseController_Admins_frank : Controller
{
}
這可能是簡單的,但我不認爲這兩者結合起來,當我嘗試將其添加到「的AllowMultiple」屬性產生一個錯誤的任何實例。
謝謝, 克里斯
這允許「frankl」訪問但阻止管理員。我做錯了什麼?MVC3 AuthorizeAttribute
[Authorize(Order=1,Roles = "Admin",Users="frankl")]
public class AuthorizeBaseController_Admins_frank : Controller
{
}
這可能是簡單的,但我不認爲這兩者結合起來,當我嘗試將其添加到「的AllowMultiple」屬性產生一個錯誤的任何實例。
謝謝, 克里斯
角色和用戶應專用。如果你想將它們結合起來,你可以寫一個自定義屬性授權:
public class MyAuthoirizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
var user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
var usersSplit = SplitString(Users);
var rolesSplit = SplitString(Roles);
return
(usersSplit.Length > 0 && usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) ||
(rolesSplit.Length > 0 && rolesSplit.Any(user.IsInRole));
}
private string[] SplitString(string original)
{
if (string.IsNullOrEmpty(original))
{
return new string[0];
}
return (from piece in original.Split(',')
let trimmed = piece.Trim()
where !string.IsNullOrEmpty(trimmed)
select trimmed).ToArray();
}
}
然後:
[MyAuthorize(Order = 1, Roles = "Admin", Users="frankl")]
public class AuthorizeBaseController_Admins_frank : Controller
{
...
}
不幸的是,AuthorizeAttribrute
會讓你要麼指定有效的用戶或有效角色 - 不能同時使用。這是來自MVC 3源代碼的相關位。
protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated) {
return false;
}
if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
return false;
}
if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) {
return false;
}
return true;
}
你要麼需要做「弗蘭克」管理員,或創建一個自定義授權attribrute
我同意達林,他們應分別單獨使用。我想爲報告創建一個小組/角色,並在公交車上班時發生「frankl」事件,但客戶沒有這樣看待。感謝您提供自定義屬性上的代碼。 – Chris 2012-08-15 14:55:50