30

カスタムロールプロバイダーを作成していて、コントローラーでロールを指定するAuthorize属性を設定すると、次のように正常に機能します。

[Authorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller
...

ただし、ユーザーがこのコントローラーにアクセスできない場合は、ログインページにリダイレクトされます。彼を「AcessDenied.aspx」ページにリダイレクトするにはどうすればよいですか?

4

9 に答える 9

43
[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
        }
    }
}
于 2009-08-14T19:52:49.307 に答える
25

これが、eu-ge-neの答えに基づいた私の解決策です。Mineは、ユーザーがログインしていない場合はログインページに正しくリダイレ​​クトしますが、ログインしているがそのページを表示する権限がない場合はアクセス拒否ページにリダイレクトします。

[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("~/Account/Logon");
            return;
        }

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/Account/Denied");
        }
    }
}

AccountController.cs:

public ActionResult Denied()
{
    return View();
}

Views / Account / Denied.cshtml :(かみそりの構文)

@{
    ViewBag.Title = "Access Denied";
}

<h2>@ViewBag.Title</h2>

Sorry, but you don't have access to that page.
于 2011-01-19T18:22:41.320 に答える
8

この非常によく似た質問からのtvanfosson回答を見てください。これは私が行っていることです(tvanfossonのおかげで)。

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...

ユーザーがロールに属していない場合は、ViewNameで指定されたwビューを取得します。

于 2009-08-15T03:00:46.640 に答える
6

ログオンページをハードコーディングする必要がなく、オプションで属性内にアクセス拒否ビューを設定することにより、マットの回答がわずかに改善されました。

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedViewName { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
                AccessDeniedViewName = "~/Account/AccessDenied";

            filterContext.Result = new RedirectResult(AccessDeniedViewName);
        }
    }
}
于 2011-12-30T19:28:14.050 に答える
6

リダイレクトが常に最善の解決策であるとは限りません

標準のhttpコード403を使用します。

return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
于 2014-12-11T09:56:27.367 に答える
1

同様の問題がありました。どんな役割を持っていても、AccessDeniedではなく常にログインページにリダイレクトされました。修正は信じられないほど簡単でしたが、すべての場合に機能するとは限りません。したがって、Startup.csで次の2行の順序が間違っていることがわかりました。

app.UseAuthentication();
app.UseAuthorization();

app.UseAuthentication();かどうかを確認してください。app.UseAuthorization();の前です。

言い換えれば、「あなたは誰ですか?」と尋ねます。最初に、次に「ここで許可されていますか?」、その逆ではありません。

于 2020-04-27T15:33:58.320 に答える
0
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("~/Account/AccessDenied");
            }
        }
    }
于 2013-11-05T15:06:13.870 に答える
0

私はVicの回答に基づいて、アプリケーションの領域ごとに異なるアクセス拒否ページを作成できるようにしました。RedirectToRouteResult代わりに、アプリケーションのルートに相対的なURLにリダイレクトする代わりに、現在の領域のコントローラーとアクションにリダイレクトする代わりに、を返すことによってそれを行いました。

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedController { get; set; }
    public string AccessDeniedAction { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction))
            {
                AccessDeniedController = "Home";
                AccessDeniedAction = "AccessDenied";
            }

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction }));
        }
    }
}
于 2014-01-31T16:34:12.157 に答える
0

Vic Alcazarのほんの少しの更新、リダイレクトにリクエストURLの詳細を追加しました。これにより、拒否されたアクセスの詳細と、必要に応じて誰が拒否したかをログに記録できます。

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedViewName { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
                AccessDeniedViewName = "~/Account/AccessDenied";

            var requestUrl = filterContext.HttpContext.Request.Url;

            filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl));
        }
    }
}
于 2014-10-09T22:15:18.660 に答える