0

我正在學習如何使Asp.Net MVC標識2.0正常工作。解析OAuth承載認證的ASP.NET MVC標識

我有這樣的代碼,對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"; 
    } 

這裏是

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

我已經看過了ClaimsIdentity和AuthenticationTicket和我的源代碼Startup.Auth.cs代碼沒有看到票證是如何註冊身份的。

我的問題是這張票是如何在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