2017-03-02 23 views
7

OWINを使用したトークンベースの認証を使用するオンラインチュートリアルの後、デモのようにハードコードされたユーザー名/パスワードに対してテストアプリケーションを認証することができました。Asp.Net WebApi OWIN認証

しかし、今では自分のWebアプリケーションのモデルを使用したいと思っています。

私の認証は、デモが示すように、このコードで行われます。

namespace UI 
{ 
    public class AuthorisationServerProvider : OAuthAuthorizationServerProvider 
    { 
     public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
     { 
      context.Validated(); // Means I have validated the client. 
     } 

     public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
     { 
      // Here we validate the user... 
      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      if (context.UserName == "user" && context.Password == "password") 
      { 
       identity.AddClaim(new Claim(ClaimTypes.Role, "admin")); 
       identity.AddClaim(new Claim("username", "user")); 
       identity.AddClaim(new Claim(ClaimTypes.Name, "My Full Name")); 
       context.Validated(identity); 
      } 
      else 
      { 
       context.SetError("Invalid grant", "Username or password are incorrect"); 
       return; 
      } 
     } 

    } 
} 

私は...私のWEBAPIコントローラから、上記のコードを呼び出す方法ではないことを確認私はからモデルを受け取るWebAPIのコントローラを持っている、と。現時点では、上のコードは、起動コードで定義されているmyurl/tokenの呼び出しを想定しています。

私のwebapiコールからのURLは/トークンであると推測していますか?

Login() 
    { 
     var data = { 
      username : this.login.emailAddress(), 
      password : this.login.password(), 
      RememberMe: this.login.rememberMe(), 
      grant_type: "password" 
     } 

     return $.ajax({ 
      type: "POST", 
      data: data ? JSON.stringify(data) : null, 
      dataType: "json", 
      url: "/token", 
      contentType: "application/json" 
     }).done((reply) => { 
      alert("Done!"); 
     }); 

    } 

しかし、私は例外を取得::だから、私のUI上で私の(ノックアウトビューモデル)のコードで、私はこれを試してみました

“error”: “unsupported_grant_type” 

「ポストマン」で、私は認証できていますハードコードされたユーザー名/パスワード。

enter image description here

しかし、私が認証するために、私のUIからの私のAPIコールを配線する方法がわからないです。

私はこのように、私のAPIコントローラ(ASP.Net WebAPIの)上の「ログイン」メソッドを作成するために期待していた。

[Route("login"), HttpPost, AllowAnonymous] 
public ReplyDto Login(LoginRequest login) 
{ 
    ReplyDto reply = _userService.Login(login.Email, login.Password); 
    return reply; 
} 

だから、私の_userServiceチェックをユーザがデータベースにある場合...もしそうなら、OAuth認証をここでいくつかのパラメータを渡して呼んでください。しかし、それが可能であるかどうかはわかりません。このAPIメソッドから認証を呼び出すことはできますか?私は/トークンビットを削除する必要があります。

答えて

7

すでにログインメソッドを作成しているので、ログインメソッドを作成する必要はありません。それはhttp://localhost:1234/tokenです。これは、ユーザーが存在し、パスワードが正しい場合にトークンを生成します。しかし、あなたのロジックを実装するためにあなたがOAuthAuthorizationServerProvider

public class DOAuthServerProvider : OAuthAuthorizationServerProvider 

をから派生させ、独自のAuthServerProviderを実装する必要があり、この動作を取得し、あなたがメソッドをオーバーライドします:あなたは、ほとんど存在し

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     try 
     { 
      string allowedOrigin = context.OwinContext.Get<string>(DOAuthStatic.ALLOWED_CORS_ORIGINS_KEY); 

      if (allowedOrigin != null) 
      { 
       context.OwinContext.Response.Headers[DOAuthStatic.CORS_HEADER] = allowedOrigin; 
      } 

      DAuthenticationResponse authResponse = await _authRepository.Authenticate(context.UserName, context.Password); 

      if (!authResponse.IsAuthenticated) 
      { 
       context.SetError(OAuthError.InvalidGrant, $"{(int)authResponse.AuthenticateResult}:{authResponse.AuthenticateResult}"); 

       return; 
      } 

      if (authResponse.User.ChangePasswordOnLogin) 
      { 
       _userAuthenticationProvider.GeneratePasswordResetToken(authResponse.User); 
      } 

      IDictionary<string, string> props = new Dictionary<string, string> 
      { 
       { 
        DOAuthStatic.CLIENT_NAME_KEY, context.ClientId ?? string.Empty 
       } 
      }; 

      ValidateContext(context, authResponse, props); 
     } 
     catch (Exception ex) 
     { 
      DLogOAuth.LogException(ex, "DCO0407E", "OAuthServerProvider - Error validating user"); 

      throw; 
     } 
    } 

を、あなただけのさらに2つの手順を実行する必要があります。

  1. アクセスを制限するために、メソッドまたはコントローラにAuthorizeAttributeを追加します。認証されていないユーザー。
  2. ヘッダーを要求するアクセストークンを追加します。この手順をスキップすると、権限のない401というHTTPステータスコードが表示されます。これは、手順1で追加したauthorize属性が機能しているかどうかを確認する方法です。ここで

本当によく、すべてを説明するチュートリアルの偉大なシリーズです:Token based authentication(私が持っているよりもずっといい:))

1

変更は 「アプリケーション/にコンテンツタイプ「アプリケーション/ jsonの」 www-form-urlencoded "

あなたは郵便配達員の" application/www-form-urlencoded "形式のデータを送信しています。しかしあなたのコードで "application/Json"を使用するコンテンツタイプ不一致。したがって、データは適切な形式を送信しません。

うまくいけば変更できます。

関連する問題