2016-08-11 11 views
6

G'day!サービスファブリックOwinパイプラインでWsFederation認証が機能しない

私はこれについて書いている時点では全く新しいので、これはあまり見ていません。私は、ユーザーがACS経由で認証された後、Webアプリケーション(html/js)を提供するサービスファブリックアプリケーションを作成しようとしています。これは、非サービスファブリック環境、つまりIISの背後にある伝統的なAsp NetアプリケーションでOWINと簡単に連携することができます。 Azure Access Controlでトークン認証を使用しようとしています。

私は現在、サービスファブリックを使用していることから、OWINの仕組みが変わりましたか?以下は私のOWIN ConfigureApp()関数は、私のサービス・ファブリック・アプリケーションでは、私のStartup.cs内にある:私は前に、最終的には私のブラウザのhtmlを提供するために使用されるウェブAPIミドルウェアをWsFederationミドルウェアを注入する方法

public static void ConfigureApp(IAppBuilder appBuilder) 
    {       
     appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     appBuilder.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = _realm, 
       MetadataAddress = _acsXmlMetaDataUrl 
      }); 

     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     appBuilder.UseWebApi(config); 
    } 

お知らせ/ jsアプリケーション。これが始まり、RESTのURLにナビゲートするなどの健全性テストを行うと、Azure Access Controlにリダイレクトされずにサインインして認証トークンを取得するのではなく、コンテンツがすぐに配信されます。同じOWIN構成を持つ従来のAsp Netアプリケーションでは、リソースが提供される前にAzure Access Controlにリダイレクトされています。

私の質問は、これがサービスファブリックコンテキストで機能するように、WsFedミドルウェアをOWINパイプラインに挿入する方法です。

ご協力いただければ幸いです。ありがとうございます!

答えて

1

私はこのコードがサービスファブリックではなくMVCで動作する理由がわかりません。私も同じ問題を抱えていましたが、私はそれをSFのために働かせる方法を見つけました。

This articleにはチュートリアルがあります。

あなたのコードでは、は、を認証するように言っていません。すべてを設定していますが、起動していません。

app.Map("/login", map => 
      { 
       map.Run(async ctx => 
       { 
        if (ctx.Authentication.User == null || 
         !ctx.Authentication.User.Identity.IsAuthenticated) 
        { 
         ctx.Response.StatusCode = 401; 
        } 
        else 
        { 
         ctx.Response.Redirect("/"); 
        } 
       }); 
      }); 

app.Run(async ctx => 
      { 
       var user = ctx.Authentication.User; 
       var response = ctx.Response; 

       response.ContentType = "text/html"; 

       if (user != null && user.Identity.IsAuthenticated) 
       { 
        await response.WriteAsync(string.Format("<h2>{0}</h2>", 
         user.Claims.First().Issuer)); 

        await response.WriteAsync("<dl>"); 
        foreach (var claim in user.Claims) 
        { 
         await response.WriteAsync(string.Format(
          "<dt>{0}</dt> <dd>{1}</dd>", 
          claim.Type, 
          claim.Value)); 
        } 
        await response.WriteAsync("</dl>"); 
       } 
       else 
       { 
        await ctx.Response.WriteAsync("<h2>anonymous</h2>"); 
       } 
      }); 

あなたのウェブサイト上のリンクにアクセスしている場合は、app.Run内のコードは、あなたがログインしているかどうかをチェックするために実行を開始します。あなたがいない場合は、この場合には、それは「匿名を書きますあなたのコンテンツを読み込むのではなく、ページ上の "認証するにはyourwesite/loginに行き、コンフィグレーションでの認証プロバイダにリダイレクトします。

結論:ログイン、ログアウト、app.Runスニペットを追加してください。必要があれば最後の調整をしてください。

関連する問題