2017-03-20 56 views
0

編輯 我在尋找一個通用的辦法攔截認證請求,應該在全球範圍內配置此方式,利用中間件或事件等,無關的框架,我正在使用(IdentityServer4)ASP核心攔截所有身份驗證請求

我正在使用IdentityServer4來驗證我的WebApi。我正在尋找事件來攔截身份驗證請求之後和身份驗證之前。

我的啓動類配置爲這種方式來處理驗證。

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "http://localhost:5000", 
    RequireHttpsMetadata = false, 

    ApiName = "api1" 
}); 

我正在尋找一個崗位認證的事件,這樣我可以創建IdentityServer4用戶給本地用戶,所以我能外鍵有引用鏈接。

是否有事件或簡單的方法來插入Post_Authentication_Requests和一般認證請求,我想做一些額外的登錄失敗嘗試以及?

回答

1

是的,大多數身份驗證中間件都有一種方法可以掛接到他們各自的身份驗證事件中。這些可以找到here。要回答你的問題,有幾個PRE和POST auth事件掛鉤,你需要選擇一個滿足你的需求。例如:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "http://localhost:5000", 
    RequireHttpsMetadata = false, 

    ApiName = "api1", 

    Events = new OpenIdConnectEvents() 
    { 
     OnMessageReceived = async context => 
     { 
      //example of a "before" event hook 
     } 

     OnTokenValidated = async context => 
     { 
      //example of an "after" event hook 
      var claimsIdentity = context.Ticket.Principal.Identity as ClaimsIdentity; 
      if (claimsIdentity != null) 
      { 
       // Get the user's ID 
       string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value; 
      } 
     } 
    } 
}); 

您還可以看到ASPNET /安全here的樣品回購爲例,他們證明他們是如何劫持失敗的認證請求返回一個500(而不是正常的401)

+0

我試圖做兩件事,如果這是他們第一次從IdentityServer4登錄時,將新用戶添加到我的數據庫,我應該使用OnTokenValidated Correct?另外,我正在嘗試登錄嘗試登錄的IP,是否應該是OnMessageReceived事件,還是有更好的辦法? –

+0

我已經實現了OnMessageReceived事件來改變這樣的: x.Events =新OpenIdConnectEvents() { OnMessageReceived = C => { 如果(c.HttpContext.WebSockets.IsWebSocketRequest && c.Request.Query.ContainsKey( 「Authentication」)) c.Token = c.Request.Query [「Authentication」]; return Task.CompletedTask; } }; 但我調試時從不進入函數調用。 – gong