2016-10-26 12 views
0

私は.NETバックエンドを使用したXamarin Formsモバイルアプリで作業しています。私はthis guideを踏襲し、正常Startup.csに1回の変更でカスタム認証を設定:なしAzureモバイルアプリXamarin.Formsを使用したカスタム+ Facebook認証

app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
     { 
      SigningKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"), 
      ValidAudiences = new[] { Identifiers.Environment.ApiUrl }, 
      ValidIssuers = new[] { Identifiers.Environment.ApiUrl }, 
      TokenHandler = config.GetAppServiceTokenHandler() 
     }); 

"もし(string.IsNullOrEmpty(settings.HostName))"。それ以外の場合は、ログイン後にすべてのリクエストが常に不正になります。

Serverプロジェクト:

  1. 認証コントローラ

    パブリッククラスClubrAuthController:ApiController { プライベート読み取り専用ClubrContext dbContext。 プライベート読み取り専用ILoggerService loggerService;

    public ClubrAuthController(ILoggerService loggerService) 
    { 
        this.loggerService = loggerService; 
        dbContext = new ClubrContext(); 
    } 
    
    public async Task<IHttpActionResult> Post(LoginRequest loginRequest) 
    { 
        var user = await dbContext.Users.FirstOrDefaultAsync(x => x.Email == loginRequest.username); 
        if (user == null) 
        { 
         user = await CreateUser(loginRequest); 
        } 
    
        var token = GetAuthenticationTokenForUser(user.Email); 
    
        return Ok(new 
        { 
         authenticationToken = token.RawData, 
         user = new { userId = loginRequest.username } 
        }); 
    } 
    
    private JwtSecurityToken GetAuthenticationTokenForUser(string userEmail) 
    { 
        var claims = new[] 
        { 
         new Claim(JwtRegisteredClaimNames.Sub, userEmail) 
        }; 
    
        var secretKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"); 
        var audience = Identifiers.Environment.ApiUrl; 
        var issuer = Identifiers.Environment.ApiUrl; 
    
        var token = AppServiceLoginHandler.CreateToken(
         claims, 
         secretKey, 
         audience, 
         issuer, 
         TimeSpan.FromHours(24) 
         ); 
    
        return token; 
    } 
    

    }

  2. Startup.cs

    ConfigureMobileAppAuth(app, config, container); 
        app.UseWebApi(config); 
    } 
    
    private void ConfigureMobileAppAuth(IAppBuilder app, HttpConfiguration config, IContainer container) 
    { 
        config.Routes.MapHttpRoute("ClubrAuth", ".auth/login/ClubrAuth", new { controller = "ClubrAuth" }); 
    
        app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
        { 
         SigningKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"), 
         ValidAudiences = new[] { Identifiers.Environment.ApiUrl }, 
         ValidIssuers = new[] { Identifiers.Environment.ApiUrl }, 
         TokenHandler = config.GetAppServiceTokenHandler() 
        }); 
    } 
    

クライアントプロジェクト:を説明したように

MobileServiceUser user = await MobileClient.LoginAsync(loginProvider, jtoken); 

は、さらに私は、紺碧のポータルにFacebookのプロバイダーを構成し210。 しかし、私はapp.UseAppServiceAuthentication(新しいAppServiceAuthenticationOptions(){...})をコメントアウトするときにのみ動作します。 Startup.csに保存します。 両方のタイプの認証を同時に行うために欠けているのは何ですか?

答えて

-1

参照するコードは、ローカル展開のみです。 Azureのデプロイメントでは、認証プロバイダを設定しなくても(カスタム認証の場合はそうではない)、App Service Authentication/Authorizationをオンにする必要があります。私の本の

チェックアウト章2からhttp://aka.ms/zumobook

+0

私はApp Service Authentication/Authorizationを有効にしていますが、app.UseAppServiceAuthentication(新しいAppServiceAuthenticationOptions(){...})なしで、未確認応答が返されています。 Startup.csに保存します。 Xamarin.Formsでカスタム+ Facebook認証を設定することは可能ですか?誰かが作業サンプルを提供できますか? –

+0

これは可能です。 Adrianが指摘していることは、app.UseAppServiceAuthentication()がカスタム認証のピースに関連していないことです。ここで問題を紹介していると思います。文字制限を打たないように私自身の答えでもっと説明します:) – mattchenderson

0

アプリサービスの認証/承認が有効になっているので、すでにトークンを検証します。これは、オーディエンスと発行者をあなたのアプリのURLと同じにする(デフォルトとして)など、トークン構造についてのことを想定しています。

も、meant for local developmentのようにトークンを検証します。したがって、あなたの例では、トークンは2回検証されます。潜在的なパフォーマンスの影響とは別に、これは一般的には問題ありません。しかし、それはトークンが両方のレイヤーで検証をパスしなければならないことを意味し、私はこれが当てはまらない、つまりエラーであると考えています。

これをチェックする1つの方法は、トークン自体を検査することです。クライアントアプリケーションにブレークポイントを設定し、得意先オブジェクトの一部となるLoginAsync()から取得したトークンを取得します。その後、http://jwt.ioのようなサービスに行き、トークンの内容がどのように見えるかを確認します。 FacebookのトークンはのIdentifiers.Environment.ApiUrlよりもaudissのクレームが異なると思われますが、最初のコードスニペットでその値を使用しているので、カスタムトークンが一致する可能性があります。

これが当てはまる場合は、両方のトークンに障害が発生している状態にある必要があります。Facebookトークンはホストされた検証をパスしますが、ローカルのミドルウェアでは失敗しますが、カスタムトークンはホストされた検証に失敗しますが、ローカルのミドルウェアは失敗します。

ここで最も簡単な解決策は、クラウドでホスティングするときにapp.UseAppServiceAuthentication()を削除することです。また、CreateToken()への電話がクラウドベースのURLを視聴者および発行者として使用することを確認する必要があります。カスタム認証用のドキュメントはhereを見つけることができます

  • この問題を見つけ、他の人々のため


  • アプリサービスの認証/承認の一般的な概要はhereです。
関連する問題