1

だから私はこのコントローラを持っています:

namespace MyNamespace.Controllers
{
  [Authorize(Roles="Administrator")]
  public class MyController : Controller

  public ActionResult Index()
  {
   ...

ご覧のとおり、管理者ロールを持つユーザーのみが MyController の Action メソッドにアクセスできます。

では、別の場所(別のコントローラ、ライブラリ クラスの別のクラスなど)から、 Current.User.Identity.Nameが MyController にアクセスできるかどうかを確認するにはどうすればよいですか? WebForms の「UrlAuthorizationModule.CheckUrlAccessForPrincipal」

の ように機能するもの。

4

1 に答える 1

1

他のコントローラーから情報を読み取る必要があります。これは、そのコンテキストと記述子をインスタンス化してAuthorizationContextから、そのコントローラーの をインスタンス化し、フィルター情報を読み取ることで実行できます。

これはあなたがそれを行う方法です

private bool ActionIsAccessibleToUser(string actionName, ControllerBase controllerBase)
{
    // Get controller context.
    var controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);

    // Get controller descriptor.
    var controllerDescriptor = new ReflectedControllerDescriptor(controllerBase.GetType());

    // Get action descriptor.
    var actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);

    // Check on authorization.
    return ActionIsAuthorized(actionDescriptor, controllerContext);
}

private bool ActionIsAuthorized(ActionDescriptor actionDescriptor, ControllerContext controllerContext)
{
    if (actionDescriptor == null)
    {
        // Action does not exist.
        return false;
    }

    // Get authorization context fo controller.
    AuthorizationContext authContext = new AuthorizationContext(controllerContext, actionDescriptor);

    // run each auth filter until on fails
    // performance could be improved by some caching
    var filters = FilterProviders.Providers.GetFilters(controllerContext, actionDescriptor);
    FilterInfo filterInfo = new FilterInfo(filters);

    foreach (IAuthorizationFilter authFilter in filterInfo.AuthorizationFilters)
    {
        // Attempt authorization.
        authFilter.OnAuthorization(authContext);

        // If result is non-null, user is not authorized.
        if (authContext.Result != null)
        {
            return false;
        }
    }

    // Assume user is authorized.
    return true;
}
于 2013-09-26T21:04:38.063 に答える