2016-12-04 6 views
0

コンソールサービスからWebサービスエンドポイントへの認可を、認可サービスとしてidentityserver3を使用して設定しようとしています。これは自己ホストAPIではなく、公開されます。私はアイデンティティサーバーのドキュメントを辿ることを試みました。私はAPIを実行しており、IdentityServerは独立して動作しています。私が問題を抱えているところでは、認証をチェックしてIDサーバからアクセストークンを要求/受信するためのAPIルートを取得しています。アイデンティティ・サーバー内でアイデンティティserver3でマシン(Console to WebAPI)認可をセットアップする

私はstartup.csファイルは、次のように定義している:IdSrvため

public void Configuration(IAppBuilder app) 
      { 
       app.Map("/identity", idsrvApp => 
       { 
        var corsPolicyService = new DefaultCorsPolicyService() 
        { 
         AllowAll = true 
        }; 

        var defaultViewServiceOptions = new DefaultViewServiceOptions(); 
        defaultViewServiceOptions.CacheViews = false; 

        var idServerServiceFactory = new IdentityServerServiceFactory() 
         .UseInMemoryClients(Clients.Get()) 
         .UseInMemoryScopes(Scopes.Get()) 
         .UseInMemoryUsers(Users.Get()); 

        idServerServiceFactory.CorsPolicyService = new 
         Registration<IdentityServer3.Core.Services.ICorsPolicyService>(corsPolicyService); 

        idServerServiceFactory.ConfigureDefaultViewService(defaultViewServiceOptions); 

        var options = new IdentityServerOptions 
        { 
         Factory = idServerServiceFactory, 
         SiteName = "Sumbission Security Token Service", 
         SigningCertificate = LoadCertificate(), 
         IssuerUri = "https://samplesubmission/identity", 
         PublicOrigin = "https://localhost:44306",      
        }; 

        idsrvApp.UseIdentityServer(options); 
       }); 
      } 

      X509Certificate2 LoadCertificate() 
      { 
       return new X509Certificate2(
        string.Format(@"{0}\certificates\idsrv3test.pfx", 
        AppDomain.CurrentDomain.BaseDirectory), "idsrv3test"); 
      } 

そして、web.configファイル内には、私は

WebAPIのは、以下の

public class SampleController: ApiController 
    { 
     [Route("test")] 
     public IHttpActionResult Get() 
      { 
      var caller = User as ClaimsPrincipal;//grants access to claim from access token 

      Message msg = new Message 
      { 
       Msg = "Connction made with secure api" + DateTime.Now, 
       // Client = caller.FindFirst("client_id").Value 
      }; 
      return Json(msg); 
     } 
    } 

    public class Message 
    { 
     public string Msg { get; set; } 
     public string Client { get; set; } 
    } 
含ま追加しました

startup.cs

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 

      app.UseIdentityServerBearerTokenAuthentication(
      new IdentityServerBearerTokenAuthenticationOptions 
      { 
       Authority = "https://localhost:44306/identity", 
       RequiredScopes = new[] { "vendorsubmission" }, 
      }); 
     } 
    } 

APIでOWInを無効にするhttps://localhost:44307/testなどの呼び出しを行い、エンドポイントにヒットすることができます。これは、タスクのエラーを実行すると

コンソールアプリは(タスクが取り消された)のProgram.cs

class Program 
    { 

     static void Main(string[] args) 
     { 
      var response = GetClientToken(); 
      CallApi(response); 
     } 

     static void CallApi(TokenResponse response) 
     { 
      var client = new HttpClient(); 
      client.SetBearerToken(response.AccessToken); 
      System.Console.WriteLine(client.GetStringAsync("http://localhost:44307/test").Result); 
     } 

     static TokenResponse GetClientToken() 
     { 
      var client = new TokenClient(
       "http://localhost:44306/identity/connect/token", 
       "samplecnsl", //client name 
       "F621F470-9731-4A25-80EF-67A6F7C5F4B8"); //secret 

      return client.RequestClientCredentialsAsync("vendorsubmission").Result; 

     } 
    } 

でこれが含まれています。要求されたリソースがGETをサポートしていませんというメッセージが表示されます。私は、これはCORSの問題だろうと思ったが、私はCORSは、IDサーバで有効になっていると私もweb.configファイル内のhttpプロトコルに追加:

<httpProtocol> 
     <customHeaders> 
     <clear /> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 

誰にコンソールアプリケーションを取得する方法についていくつかのガイダンスを提供することができますIDサーバーからトークンを取得しますか?私はそれが認可の問題だと感じています。私はDev IISExpresでこれをローカルで実行しています。私は現在、アイデンティティ・サーバー・ソースによって提供されている証明書を使用しています。

おかげ

答えて

1

は、いわゆるクライアントの資格情報を使用し

https://tools.ietf.org/html/rfc6749#section-4.4

を付与ここではidentityserver3

https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/ConsoleClientCredentialsClient

CORSが、それ以来、このシナリオとは無関係ですを使用するためのサンプルですブラウザベースのクライアントにのみ適用されます。したがって、おそらくあなたのWebサーバーに問題があります。

+0

フォローアップと同じように、証明書に問題がありました。現在の証明書がSHA1であり、暗号化がsha256を使用していたため、認証に失敗しました。 certをSHA256暗号に更新することで問題は解決されました。 – rlcrews

関連する問題