1

私はMVC4の新しいoAuthWebSecurity機能を使用して、サイトのユーザーのFacebook認証を行っていますが、これはうまく機能します。

ただし、私がやりたいのは、特定のコントローラーに対してのみ、基本HTTP認証を有効にすることです。

カスタムアクションフィルター(authenticationFilter)を実装して呼び出しをインターセプトし、カスタムコードを使用して基本認証を実行しようとしましたが、コードがのオーバーロードにヒットすることはありませんAuthorizationFilter

カスタムを作成するよりも、これを実装する簡単な方法はありSimpleMembershipProviderますか?

4

2 に答える 2

0

[Authorize]フィルターは以下のように使用できます。

public class BooksController : ApiController
{
    [Authorize]
    public IEnumerable<Book> Get()
    {
        var result = new List<Book>()
        {
            new Book()
            {
                Author = "John Fowles",
                Title = "The Magus",
                Description = "A major work of mounting tensions " +
                                "in which the human mind is the guinea-pig."
            },
            new Book()
            {
                Author = "Stanislaw Ulam",
                Title = "Adventures of a Mathematician",
                Description = "The autobiography of mathematician Stanislaw Ulam, " +
                                "one of the great scientific minds of the twentieth century."
            }
        };
        return result;
    }
}

詳細については、基本 HTTP 認証を確認してください

これがお役に立てば幸いです。

于 2013-01-22T19:44:05.363 に答える
0

カスタムAuthorizeAttributeを作成して、基本認証を使用して認証と承認の両方を処理できます。この属性はフィルターとして機能し、コントローラー アクションまたは Web API メソッドに到達する前に要求を処理します。オーバーライドされたOnAuthorizeメソッドでは、ヘッダー情報を取得して認証を実行できます。

ajax を使用してコントローラーまたは Web API メソッドに要求を行う場合は、基本認証を使用して認証用の資格情報を渡します。これにより、資格情報がヘッダーに配置されます。これを行うには、JQuery ajax関数のbeforeSendイベント ハンドラーを使用すると非常に簡単です。jquery.base64.js を使用して、送信される情報をエンコードします。これを行う方法の例を次に示します。

    getAuthorizationHeader = function (username, password) {
      var authType;
      var up = $.base64.encode(username + ":" + password);
      authType = "Basic " + up;
    };
    return authType;
 };

    $.ajax({
        url: _url,
        data: _data,
        type: _type,
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", getAuthorizationHeader(username, password));
        },
        success: ajaxSuccessHandler,
        error: ajaxErrHandler
    });

これは、ヘッダーで送信されるユーザー名/パスワードをエンコードします。エンコードは簡単にデコードできるため、エンコードだけに頼るには十分なセキュリティではないことに注意してください。ネットワーク経由で送信される情報が安全であることを確認するために、引き続き HTTPS/SSL を使用する必要があります。

サーバー側では、ヘッダーから資格情報を取得し、それらをデコードし、認証/承認プロセスを実行するカスタムAuthorizeAttributeを作成できます。コントローラーとは対照的に、Web API によって使用されるaaa 個別のAuthorizeAttributeがあることに注意してください。カスタムAuthorizeAttributeを作成するときは、 System.Web.Http.AuthorizeAttributeを基本クラスとして使用してください。Web API を使用している場合。それらは異なる動作をします。コントローラー用のものはログオン ページにリダイレクトする必要がありますが、Web API 用のものは成功または失敗を示す HTTP コードを返します。クライアントがそれに応じて反応できるように、認証ではなく認証による失敗を認証が区別できない場合は、Forbidden の HTTP コードを返します。

カスタムAuthorizeAttributeで使用できるヘッダーから認証情報を取得する方法の例を次に示します。

    private bool GetUserNameAndPassword(HttpActionContext actionContext, out string username, out string password)
    {
        bool gotIt = false;
        username = string.Empty;
        password = string.Empty;
        IEnumerable<string> headerVals;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out headerVals))
        {
            try
            {
                string authHeader = headerVals.FirstOrDefault();
                char[] delims = { ' ' };
                string[] authHeaderTokens = authHeader.Split(new char[] { ' ' });
                if (authHeaderTokens[0].Contains("Basic"))
                {
                    string decodedStr = SecurityHelper.DecodeFrom64(authHeaderTokens[1]);
                    string[] unpw = decodedStr.Split(new char[] { ':' });
                    username = unpw[0];
                    password = unpw[1];
                }
                gotIt = true;
            }
            catch { gotIt = false; }
        }

        return gotIt;
    }

そして、このメソッドで使用されるヘッダー データをデコードするためのコードを次に示します。

    public static string DecodeFrom64(string encodedData)
    {

        byte[] encodedDataAsBytes

            = System.Convert.FromBase64String(encodedData);

        string returnValue =

           System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

        return returnValue;

    }

ユーザー名とパスワードを取得したら、SimpleMembership プロバイダーを使用して認証と承認を実行できます。

于 2013-01-22T21:03:10.297 に答える