1

ユーザーが認証されると、他のアカウントから作成されたデータを更新/削除/読み取りするのを防ぎたい...許可403がないことを彼に伝えることで!

HasUserPermission() メソッドを呼び出す ISchoolyearService のインスタンスを取得する最良の方法は何ですか?

ここでSchoolyearServiceを新たに追加できることはわかっていますが、それではアプリでIoContainerを使用する理由がまったくなくなります。

public class UserActionsSchoolyearAuthorizationFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {
            bool canUserExecuteAction = false;
            if (actionContext.Request.Method == HttpMethod.Put)
            {
                int schoolyearId = Convert.ToInt32(actionContext.Request.GetRouteData().Values["Id"]);
                int userId = actionContext.Request.Content.ReadAsAsync<SchoolyearEditRequest>().Result.Schoolyear.UserId;
                //var schoolyearService = actionContext.ControllerContext.Controller.GetContstructorParameterServiceInstance();
                //canUserExecuteAction = schoolyearService.HasUserPermission(userId, schoolyearId);
                if (canUserExecuteAction)
                {
                    base.OnAuthorization(actionContext);
                }
                else
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
                }

            }
            // Removed for brevity

    private readonly ISchoolyearService _service;
            public SchoolyearController(ISchoolyearService service)
            {
                _service = service;
            }
4

2 に答える 2

0

SchoolyearController で _service パラメータを public にした場合、OnAuthorization メソッドで次のようなことを試すことができます。

var schoolyearController = actionContext.ControllerContext.Controller as SchoolyearController;
canUserExecuteAction = schoolyearController._service.HasUserPermission(userId, schoolyearId);
于 2014-01-17T08:33:23.987 に答える
0

最後に、現在のリクエストから ISchoolyearService を取得する方法を見つけました。

DependencyScope から登録済みのサービスを取得します。

これで、この属性をコントローラーに直接配置する必要があります。私が行う http 動詞の if/else のため、アクションに配置する必要はありません。

bool canUserExecuteAction = false;
if (actionContext.Request.Method == HttpMethod.Put)
{
    int targetId = Convert.ToInt32(actionContext.Request.GetRouteData().Values["Id"]);
    int userId = actionContext.Request.Content.ReadAsAsync<SchoolyearEditRequest>().Result.Schoolyear.UserId;
    var requstScope = actionContext.ControllerContext.Request.GetDependencyScope();
    var service = requstScope.GetService(typeof(ISchoolyearService)) as ISchoolyearService;
    canUserExecuteAction = service.HasUserPermission(userId, targetId);

    if (canUserExecuteAction)
    {
        base.OnAuthorization(actionContext); 
    }
    else
    {
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
    }
}
于 2014-01-17T10:11:43.993 に答える