0

私はAsp.Net MVC Identity 2.0を動作させる方法を学んでいます。OAuthベアラ認証用にASP.NET MVC IDを解読する

私はClaimsIdentityとAuthenticationTicketと私のためのソースコードを見てきました

//This will used the HTTP header Authorization: "Bearer 1234123412341234asdfasdfasdfasdf" 
    OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
    app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Startup.Auth.csためのコードはここでOAuthのベアラのため

[HttpGet] 
    [ActionName("Authenticate")] 
    [AllowAnonymous] 
    public String Authenticate(string user, string password) 
    { 
     if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password)) 
     { 
      return "Failed"; 
     } 

     var userIdentity = UserManager.FindAsync(user, password).Result; 
     if (userIdentity != null) 
     { 
      if (User.Identity.IsAuthenticated) 
      { 
       return "Already authenticated!"; 
      } 

      var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType); 
      identity.AddClaim(new Claim(ClaimTypes.Name, user)); 
      identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id)); 

      AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); 
      var currentUtc = new SystemClock().UtcNow; 
      ticket.Properties.IssuedUtc = currentUtc; 
      ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(1)); 

      string AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket); 
      return AccessToken; 
     } 
     return "Failed in the end"; 
    } 

に動作します。このコードを持っていますチケットがアイデンティティのためにどのように登録されているかわかりません。

このチケットはOwinパイプラインにどのように登録されましたか?

可能であれば、このチケットを取り消すことを目指しています。

ありがとうございます。

答えて

0

まずは、Taiseer Joudehのgreat tutorial on ASP.NET Identity 2です。

これは、OWINアプリケーションパイプラインにベアラトークン処理を追加する行です。

app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

また、認可プロバイダを自分で作成しましたか?

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

PublicClientId = "self"; 
OAuthServerOptions = new OAuthAuthorizationServerOptions 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/Token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1440),  //TODO: change to smaller value in production, 15 minutes maybe 
    Provider = new SimpleAuthorizationServerProvider(PublicClientId), 
    RefreshTokenProvider = new SimpleRefreshTokenProvider() 
}; 

app.UseOAuthAuthorizationServer(OAuthServerOptions); 

OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

マイSimpleAuthorizationServerProviderは、このような助成方法があります:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin") ?? "*"; 

    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

    if (user == null) 
    { 
     context.SetError("invalid_grant", "The user name or password is incorrect."); 
     return; 
    } 

    var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); 
    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
    identity.AddClaim(new Claim("sub", context.UserName)); 

    foreach (var role in userManager.GetRoles(user.Id)) 
    { 
     identity.AddClaim(new Claim(ClaimTypes.Role, role)); 
    } 

    var props = new AuthenticationProperties(new Dictionary<string, string> 
    { 
     {"as:client_id", context.ClientId ?? string.Empty} 
    }); 

    var ticket = new AuthenticationTicket(identity, props); 
    context.Validated(ticket); 
} 

ちょうど約すべてのこののは、前述のチュートリアルに基づいていたが、私のスタートアップコードは、より多くのこのようになります。それが役に立てば幸い。

更新 Taiseer on this pageに応じたトークンを取り消す標準的な方法はありません。

認証されたユーザーからのアクセスを取り消す

ユーザーが長く住んでいたアクセストークンを取得すると、彼がいる限り、彼のアクセストークンの有効期限が切れていないように標準的な方法 がないサーバリソース にアクセスできるようになります認証サーバーが カスタムロジックを実装していない限り、アクセストークンを取り消し、生成されたアクセストークンを データベースに格納し、各要求でデータベースチェックを実行する必要があります。しかしリフレッシュ トークンを使用すると、システム管理者は リフレッシュトークン識別子をデータベースから削除するだけでアクセスを取り消すことができるので、システムが 新しいアクセストークンに削除されたリフレッシュトークンを要求すると、認証 サーバは、もはや が利用できなくなりました(これについては詳細をご覧ください)。

しかし、here is an interesting approachあなたが必要とするものを達成する可能性があります。ちょっとしたカスタム実装が必要になります。

+0

ご返信ありがとうございます。はい、私はTaiseerのチュートリアルを勉強して、それは非常に良いです。投稿したコードも同じように動作します。私がチケットを取り消す方法があるかどうか知りたいのですが? – superfly71

+0

@ superfly71投稿を更新しました。私はあなたが望むものを達成するためにリフレッシュトークンを実装する必要があると思います。 – BBauer42

+0

私が実際にあなたが提供したリンクに記載されているブラックリストアプローチを採用しました。私はもっ​​と良いアプローチを望んでいました。とにかくありがとうございました! – superfly71

関連する問題