2017-08-07 12 views
1

私はMVC 5アプリケーションでOAuth2認証を実装しているので、Androidアプリで使用できます。しかし、Oauth2やトークン認証を使用することはなかったので、どのようになっているのかは分かりません。OAuth2でMVC5からクライアントIDとクライアントシークレットを取得する方法は?

OwinContextExtensions.cs

public static class OwinContextExtensions 
{ 
    public static string GetUserId(this IOwinContext ctx) 
    { 
     var result = "-1"; 
     var claim = ctx.Authentication.User.Claims.FirstOrDefault(c => c.Type == "UserID"); 
     if (claim != null) 
     { 
      result = claim.Value; 
     } 
     return result; 
    } 
} 

Startup.Auth.cs

public partial class Startup 
{ 
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

    static Startup() 
    { 
     OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/token"), 
      Provider = new OAuthAppProvider(), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(2), 
      AllowInsecureHttp = true 
     }; 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseOAuthBearerTokens(OAuthOptions); 
    } 
} 

OAuthAppProvider.cs

public class OAuthAppProvider : OAuthAuthorizationServerProvider 
{ 
    private ProtokolEntities db = new ProtokolEntities(); 
    public IFormsAuthenticationService FormsService { get; set; } 
    public IMembershipService MembershipService { get; set; } 


    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     if (MembershipService == null) { MembershipService = new AccountMembershipService(); } 

     return Task.Factory.StartNew(() => 
     { 
      var username = context.UserName; 
      var password = context.Password; 


      var userID = db.aspnet_Users.Where(x => x.UserName == username).SingleOrDefault().UserId.ToString(); 

      if (MembershipService.ValidateUser(username, password)) 
      { 
       var claims = new List<Claim>() 
       { 
        new Claim(ClaimTypes.Name, username), 
        new Claim("UserID", userID) 
       }; 

       ClaimsIdentity oAutIdentity = new ClaimsIdentity(claims, Startup.OAuthOptions.AuthenticationType); 
       context.Validated(new AuthenticationTicket(oAutIdentity, new AuthenticationProperties() { })); 
      } 
      else 
      { 
       context.SetError("invalid_grant", "Error"); 
      } 
     }); 
    } 

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     if (context.ClientId == null) 
     { 
      context.Validated(); 
     } 
     return Task.FromResult<object>(null); 
    } 
} 

スタートアップ:

は、これまでのところ私はMVCでfolowingコードを実装しました.cs.cs私はポストマンを開き、http://localhost:1076/tokenにPOSTメソッドを使用する場合

[assembly: OwinStartup(typeof(PageOffice.Startup))] 
namespace PageOffice 
{ 

    public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.MapSignalR(); 

      ConfigureAuth(app); 
     } 
    } 
} 

、私はボディ開く - 生>と

grant_typeを書く=パスワード&パスワード= mypasswordを&ユーザ名= myusernameと指定

後私はこれを結果として得る:

{ 
    "access_token": "QmmWSh4OZPfC8uv-jyzFzZx1KP05T8b09QlPP3Cy-_Zr9qvWtzWpxNTXOhc4U387N6VHNCnIPklgTEk8CISMyXlcsWAz7MxlRN8qI_Ajg8gjEphHUS1SrO0uDRG2XRqtX1gvTVupym_1xtsdjlwj2VXoc6ySvR0ihb2YjuXnSd4CNgKKaMBQLb1w8P1XB13jc4Pc5tump4-Y4dYn3A5hpvtc9fqpgVAUjZFdiJ_HXMiIpgmqdIFim0Ty8oRZolzpm3RSMPRV6ZIpZBqHG1A2kcdWN-52ZkHuL4_7U743vW0", 
    "token_type": "bearer", 
    "expires_in": 172799 
} 

クライアントID」と「クライアントシークレット」はどのようにして分かりますか? また、私は実際にどのように私はアンドロイドでこのaccess_tokenを使用するとわかりませんthisチュートリアルの説明は十分でしょうか?これだけのコードの読み取りと気の毒ため

感謝:) RFCについてOAuth2 for native applicationsはあり

答えて

0

。認可コード許可フローを使用することを推奨しますが、クライアントバイナリファイルに秘密情報を保存できないため、クライアントシークレットは使用しないでください。

リソース所有者のパスワード資格情報フロー(OAuth2 RFCを参照)は、アプリケーションがパスワードを知っている必要があるため、リソース所有者がアプリケーションを完全に信頼できる場合にのみご使用ください。

OAuth2プロバイダでアプリケーション(クライアント)を登録すると、クライアントIDとシークレットが取得または指定されます。

リンク先のチュートリアルでは、OAuthのバージョン1を話し合うように見える、ではない2.

+0

おかげで、私は今、正しい道の上にいます。私は間違ったリンクを送ったが、今は修正されている。私はこのチュートリアルが助けになると思います。 –

+0

@Jan Halasa、 あなたが言いましたように、クライアントと秘密は、アプリケーションreg.assume中に取得することができます私のクライアントは、私のコードでクライアントIDと秘密をハードコアする必要がありますか?または、SQLに格納し、ハードコードされた値と比較する必要がありますか? – Jayendran

関連する問題