8

本質的に、誰かが私の属性にリストされた役割の一部ではない場合、友好的なメッセージを表示したいと考えています。現在、私のアプリケーションは、ユーザーをログイン画面に戻すだけです。[AuthorizeAttribute] を拡張するだけのカスタム属性の作成について話している投稿をいくつか読みましたが、これを行うにはすぐに使える何かが必要だと思いますか?

ユーザーをログインフォームに送信するのではなく、「許可されていません」というメッセージを送信するために必要な場所の正しい方向に誰かが私を向けることができますか?

4

5 に答える 5

6

$ 0.02を追加するのが少し遅れるかもしれませんが、CustomAuthorizationAttribueを作成するときに、AuthorizationContext.Resultプロパティを使用して、AuthorizeAttribute.HandleUnauthorizedRequestメソッドがユーザーに指示する場所を指定できます。

承認に失敗した後にユーザーを送信するURLを指定できる非常に簡単な例を次に示します。

public class Authorize2Attribute : AuthorizeAttribute
{
    // Properties

    public String RedirectResultUrl { get; set; }

    // Constructors

    public Authorize2Attribute()
        : base()
    {
    }

    // Overrides

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (String.IsNullOrEmpty(RedirectResultUrl))
            base.HandleUnauthorizedRequest(filterContext);

        else
            filterContext.Result = new RedirectResult(RedirectResultUrl);
    }
}

また、以前の投稿で提案されているように、ユーザーを/ Error / Unauthorizedにリダイレクトしたい場合:

[Authorize2(Roles = "AuthorizedUsers", RedirectResultUrl = "/Error/Unauthorized")]
public ActionResult RestrictedAction()
{
    // TODO: ...
}
于 2010-08-30T20:26:54.423 に答える
3

私は数日前にこの問題に遭遇し、解決策は少し詳細ですが、ここに重要な部分があります。このメソッドでは、承認が失敗したときにを返しAuthorizeAttributeます。これにより、カスタム結果を返すのが少し難しくなります。OnAuthorizationHttpUnauthorizedResult

私がやったことは、CustomAuthorizeAttributeクラスを作成し、OnAuthorizationメソッドをオーバーライドして、代わりに例外をスローすることでした。次に、カスタムエラーハンドラーを使用してその例外をキャッチし、401(Unauthorized)を返す代わりに、カスタマイズされたエラーページを表示できます。

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public virtual void OnAuthorization(AuthorizationContext filterContext) {
        if (filterContext == null) {
            throw new ArgumentNullException("filterContext");
        }

        if (AuthorizeCore(filterContext.HttpContext)) {
            HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
            cachePolicy.SetProxyMaxAge(new TimeSpan(0));
            cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
        }
        else {
            // auth failed, redirect to login page
            // filterContext.Result = new HttpUnauthorizedResult();

            throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");                
        }
    }
}

次に、web.configで、特定のエラーのカスタムハンドラーを設定できます。

    <customErrors mode="On" defaultRedirect="~/Error">
        <error statusCode="401" redirect="~/Error/Unauthorized" />
        <error statusCode="404" redirect="~/Error/NotFound" />
    </customErrors>

次に、独自のErrorControllerを実装して、カスタムページを提供します。

Response.TrySkipIisCustomErrors = true;IIS7では、カスタムエラーを有効にするための設定を調べる必要があります。

于 2010-01-07T21:10:54.193 に答える
2

crazyarabian と非常に似ていますが、ユーザーが実際に認証されている場合にのみ、自分の文字列にリダイレクトします。これにより、属性は、現在ログインしていない場合は標準のログオン ページにリダイレクトできますが、URL へのアクセス許可がない場合は別のページにリダイレクトできます。

public class EnhancedAuthorizeAttribute : AuthorizeAttribute
{
    public string UnauthorizedUrl { get; set; }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var redirectUrl = UnauthorizedUrl;
        if (filterContext.HttpContext.User.Identity.IsAuthenticated && !string.IsNullOrWhiteSpace(redirectUrl))
        {
            filterContext.Result = new RedirectResult(redirectUrl);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}
于 2011-05-13T17:20:42.463 に答える
2

ロジックの単純化または完全な制御が必要な場合は、アクション メソッドでこれを呼び出すことができます。

User.IsInRole("NameOfRole");

bool を返し、その結果に応じて残りのロジックを実行できます。

私がいくつかのケースで使用した別のものは次のとおりです。

System.Web.Security.Roles.GetRolesForUser();

それはstring[]を返すと思いますが、それについて私を引用しないでください。

編集: 例は常に役立ちます...

public ActionResult AddUser()
{
    if(User.IsInRoles("SuperUser")
    {
        return View("AddUser");
    }
    else
    {
        return View("SorryWrongRole");
    }
}

戻り値の型が「ActionResult」である限り、受け入れられた戻り値の型 (ViewResult、PartialViewResult、RedirectResult、JsonResult...) のいずれかを返すことができます。

于 2010-01-07T18:50:05.443 に答える
0

デフォルトの動作は、[Authorize] 属性が HTTP 401 を返すことです。 FormsAuthenticationModule (デフォルトで読み込まれる) は、この 401 をインターセプトし、ユーザーをログイン ページにリダイレクトします。System.Web.Security.FormsAuthenticationModule::OnLeave in Reflector を見て、私の言いたいことを確認してください。

AuthorizeAttribute に HTTP 401 を返す以外のことをさせたい場合は、AuthorizeAttribute::HandleUnauthorizedRequest メソッドをオーバーライドし、そこでカスタム ロジックを実行する必要があります。または、~\Web.config の次の部分を変更します。

<forms loginUrl="~/Account/LogOn" timeout="2880" />

~/AccessDenied.

于 2010-01-07T19:35:39.360 に答える