13

免責事項: 私は MVC4 + Web Api + Web サービス全般 + JQuery を初めて使用することから始めましょう。間違った角度でこれを攻撃している可能性があります。

.NET 4 を Azure にデプロイするために、C# で Web MVC アプリ + Web API を構築しようとしています。Web API は、モバイル クライアント (iOS、RestKit を使用) によって使用されます。

Web MVC アプリは比較的単純です。フォーム認証と SimpleMembership を使用したいと考えています。これは達成され、正常に動作します。

JQuery (Knockout) スクリプトの Web API メソッドを使用して、Web ページの一部を埋めます。したがって、JQuery はフォーム認証によって認証された同じ ID を使用することが期待されます。

ただし、Web Api はモバイル クライアントから直接呼び出すことができるという考え方です。それらのフォーム認証はありません。

Thinktecture アイデンティティ モデル ( http://nuget.org/packages/Thinktecture.IdentityModel https://github.com/thinktecture/Thinktecture.IdentityModel.40 ) を検討してきました。BasicAuth および AcessKey ハンドラーを構成に追加したところ、機能しました (以下のコードを参照)。

認証されずに webapi にアクセスしようとすると、ブラウザに基本認証ダイアログが表示され、期待どおりに動作します。

「問題」は、フォーム認証を介して既にログインしていて、Web Api メソッドを呼び出そうとすると、依然として基本認証ダイアログが表示されることです。つまり、Thinktecture IdentityModel はフォーム認証を完全に無視しているようです。

私の質問は次のとおりです。

  1. 私の期待は正しいですか?フォーム認証を行ったら、JQuery スクリプトなどを同じブラウザー ユーザー セッションから Web API にアクセスさせるために他に何もすべきではありません。
  2. どうすれば修正できますか?
  3. 私の期待が正しくない場合; これはどのように機能するはずですか?つまり、JQuery スクリプトを認証させるにはどうすればよいですか?

私は Stackoverflow に同様の質問がたくさんあることを知っています。私は正直に多くのことを調べたり、ビデオを見たりしましたが、明らかな何かが欠けているか、テクノロジーの初心者向けの明確なドキュメントがありません。

助けてくれてありがとう。ありがとう。

public static AuthenticationConfiguration CreateConfiguration()
{
var config = new AuthenticationConfiguration
        {
            DefaultAuthenticationScheme = "Basic",
            EnableSessionToken = true,
            SetNoRedirectMarker = true
        };            

config.AddBasicAuthentication((userName, password) => userName == password, retainPassword: false);
config.AddAccessKey(token =>
        {
            if (ObfuscatingComparer.IsEqual(token, "accesskey123"))
            {
                return Principal.Create("Custom",
                    new Claim("customerid", "123"),
                    new Claim("email", "foo@customer.com"));
            }

            return null;
        }, AuthenticationOptions.ForQueryString("key"));
4

1 に答える 1

6

これが、私が以前に思いついたこの問題の解決策です。

注:このソリューションには、Thinktecture Identity Model は含まれていません。

委任ハンドラーである抽象BasicAuthenticationHandlerクラスがあります。このハンドラーは、最新の安定したWebAPIDoodle NuGet パッケージをインストールすることで取得できます。

要求がすでに認証されている場合 (例: フォーム認証による)、認証プロセスを抑制するために、この基本基本認証ハンドラーにヒントを与えることができます。登録する必要があるカスタム ハンドラーは次のようになります。

public class MyApplicationAuthHandler : BasicAuthenticationHandler {

    public MyApplicationAuthHandler() 
        : base(suppressIfAlreadyAuthenticated: true) { }

    protected override IPrincipal AuthenticateUser(
        HttpRequestMessage request, 
        string username, 
        string password, 
        CancellationToken cancellationToken) { 

        //this method will be called only if the request
        //is not authanticated.

        //If you are using forms auth, this won't be called
        //as you will be authed by the forms auth bofore you hit here
        //and Thread.CurrentPrincipal would be populated.

        //If you aren't authed:
        //Do you auth here and send back an IPrincipal 
        //instance as I do below.

        var membershipService = (IMembershipService)request
            .GetDependencyScope()
            .GetService(typeof(IMembershipService));

        var validUserCtx = membershipService
            .ValidateUser(username, password);

        return validUserCtx.Principal;
    }

    protected override void HandleUnauthenticatedRequest(UnauthenticatedRequestContext context) {

        // Do nothing here. The Autharization 
        // will be handled by the AuthorizeAttribute.
    }
}

最後のステップとして、コントローラーとアクション メソッドにSystem.Web.Http.AuthorizeAttribute( ではなくSystem.Web.Mvc.AuthorizeAttribute) 適用して、特定のロールとユーザーに承認を与える必要があります。

これが問題の解決に役立つことを願っています。

于 2012-10-22T09:00:55.617 に答える