エンティティモデルを渡して、UserFKがあり、現在のユーザーが管理者の役割を果たしていないかどうかを確認できるシナリオを試してみようとしています。UserFKが現在のユーザーのUserIdと一致することを確認してくださいdbから..。
私はジェネリックで最後のビットを解決することができません..私は正しい軌道に乗っていると思いますが、あまり確かではありません..
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class IsOwnerAttribute<T> : AuthorizeAttribute where T : class
{
public IsOwnerAttribute(IUnitOfWork context)
{
this.context = context;
}
public string RouteParameter
{
get { return this.routeParameter; }
set { this.routeParameter = value; }
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
else if (IsOwner(filterContext))
{
return;
}
else
{
ViewDataDictionary viewData = new ViewDataDictionary();
viewData.Add("Message", "You do not have sufficient privileges for this operation.");
filterContext.Result = new ViewResult { ViewName = "Error", ViewData = viewData };
}
}
bool IsOwner(AuthorizationContext filterContext)
{
bool result = false;
int id = -1;
if (filterContext.RouteData.Values.ContainsKey(this.RouteParameter))
{
id = Convert.ToInt32(filterContext.RouteData.Values[this.RouteParameter]);
}
var currentUser = Membership.GetUser();
if (currentUser != null && !filterContext.HttpContext.User.IsInRole("Administrator"))
{
var userGuid = (Guid)currentUser.ProviderUserKey;
// Stuck here.. trying to work out how with the Set<T> how i could then check if it has an Id property and a UserFK property and if it does then basically look up if the ID matches the ID in the route and the UserFK matches the userGuid then let them access the content...
result = context.Set<T>().Where(c => c.Id == id && c.UserFK == userGuid).SingleOrDefault() != null;
}
return result;
}
string routeParameter = "id";
readonly IUnitOfWork context;
readonly IDbSet<T> dbset;
}
私はそれを間違った方法で考えているのか、それとももっと良い方法があるのかわかりませんが、何が可能か知りたいです。