1

すべてのコントローラーのすべてのビューの前に、サイトのマスターページに入るデータを渡す必要がないようにするために、コンストラクターでデータを設定する ApplicationController を作成しました...このアプローチの問題は、ビューデータの 1 つが渡す必要があるのは、現在ログインしているユーザーのプロファイル画像の URL です。

[Authorize(Roles = "Administrator")]
    public abstract class AdministratorController : Controller
    {
        private IPortalAdministratorServices _servicioPortalAdministrator;
        public AdministratorController()
        {
            _servicioPortalAdministrator = new PortalAdministratorServices();
            ViewData["associates"] = _servicioPortalAdministrator.getAssociates();
            ViewData["picture"] = _servicioPortalAdministrator.GetPic();        

        public AdministratorController(IPortalAdministratorServices service)
        {
            _servicioPortalAdministrator = service;
            }

    }

そのため、AdministratorController から継承する私の会社のコントローラーは、ビュー呼び出しごとにすべてのデータを設定する必要がなくなりました。

[Authorize(Roles = "Administrator")]
public class CompaniesController : AdministratorController
{
    private ICompaniasServices _service;

    public CompaniesController()
    {
        _service = new CompaniasServices(new ModelStateWrapper(this.ModelState));

    }

    public CompaniesController(ICompaniasServices service)
    {
        _service = service;
    }

問題はこれです:

実際にメソッドにログインせずに会社コントローラーに手動でアクセスしようとすると、GetPic() は実際には画像の URL を取得できず、誰もログインしていないため、Authorize 属性にもかかわらずこれらのメソッドが呼び出されます。 ....そのため、ログインした後でも、写真の URL の ViewData は永続的に "unknown.png" に設定されています。

このコードの一部は私のものではありません。バグを発見したばかりですが、修正方法がわかりません。

4

3 に答える 3

0
if (User.Identity.IsAuthenticated){
   ViewData["picture"] = _servicioPortalAdministrator.GetPic(); 
}
else{
   ...
}

これはあなたが使えるものですか?

于 2010-09-13T10:10:05.150 に答える
0

コンストラクターから実装を削除し、このフィルターを追加すると、[Authorize(Roles = "Administrator"), AdministratorServices] のように使用できます。

public class AdministratorServicesAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var filter = new AdministratorServicesFilter(new PortalAdministratorServices());
            filter.OnActionExecuting(filterContext);
        }
    }

public class AdministratorServicesFilter : IActionFilter
{
    private readonly IPortalAdministratorServices  _servicioPortalAdministrator;

    public AdministratorServicesFilter(IPortalAdministratorServices servicioPortalAdministrator)
    {
        _servicioPortalAdministrator = servicioPortalAdministrator;
    }

    #region IActionFilter Members

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {

    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["associates"] = _servicioPortalAdministrator.getAssociates();
        filterContext.Controller.ViewData["picture"] = _servicioPortalAdministrator.GetPic();
    }

    #endregion
}
于 2011-05-23T00:45:18.173 に答える
0

Authorize はサイトのどこでも機能しますか? そうでない場合は、web.config のセクションを見逃した可能性がありますか?

于 2010-08-04T17:18:10.013 に答える