Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ASP.NET Core Authentikacija i SignalR

[es] :: .NET :: ASP.NET :: ASP.NET Core Authentikacija i SignalR

[ Pregleda: 1889 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.dynamic.isp.telekom.rs.



+2 Profil

icon ASP.NET Core Authentikacija i SignalR06.06.2019. u 21:15 - pre 58 meseci
Imam problem sa podesavanjem konfiguracije ASP.NET core aplikacije koja koristi SignalR biblioteku za komunikaciju sa svojim klijentima. Klijenti (Angular) treba da invokaju moje methode u SIgnalR Hub i da uz svaki request salju token koji ja treba da validiram. Za sada imam ovu seljacku varijantu gde imam metodu koja radi validaciju i pozivam je na pocetku svake metode u Hubu. Inace u pitanju je symetricni token, koristi se pfx fajl i password za dekodiranje tokena.

Metoda za validaciju trenutno izgleda ovako i smestena je u singleton klasi:

Code:

public bool ValidateToken(string token)
{
  var handler = new JwtSecurityTokenHandler();     
  try
  {
    var claimsPrincipal = handler.ValidateToken(
        token,
        new TokenValidationParameters
        {
          ValidAudience = Audience,
          ValidIssuer = Issuer,
          RequireSignedTokens = false,
          TokenDecryptionKey = new X509SecurityKey(new X509Certificate2(PfxPath, Password))
        },
        out SecurityToken securityToken);

  }
  catch (Exception e)
  {
    Debug.WriteLine("token not valid, message: " + e.Message);
    return false;
  }
  return true;
}


I nju onda koristim u Hub-u kao na primer:
Code:

public void RegisterUserClient(string token)
    {
      bool validated = Auth.ValidateTokenAndGetID(token);

      if (validated)
      {
        Debug.Write("Access token validated, user id: " + userID);

      } else
      {
      throw new HubException("Token is not valid");
}


Ali ubedjen sam da bi to trebalo da se konfigurise u servisu u Startup.cs sa onim service.addAuthentication medjutim ni jedan put mi nije prosla ta autorizacija, a nisam siguran ni kako pravilno bi trebalo da posaljem token sa FE. Ovako po seljacki kad se token prosledjuje kroz parametar funkcije, to radi...

Neko imao iskustva sa ovim?
rs.ceevee.com/nenad.curcic
 
Odgovor na temu

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Re: ASP.NET Core Authentikacija i SignalR07.06.2019. u 10:50 - pre 58 meseci

Mozda ovo?

https://docs.microsoft.com/en-...-and-authz?view=aspnetcore-2.2

Ja sam koristio u standardnom ASP.Net - u i tamo se preko OWin-a IAppBuilder moze da podesi autentikacija.
 
Odgovor na temu

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.static.isp.telekom.rs.



+2 Profil

icon Re: ASP.NET Core Authentikacija i SignalR07.06.2019. u 11:12 - pre 58 meseci
Od tog clanka sam i krenuo, ali kako se malo zakomplikovala validacija (ValidateToken metod) nisam uspeo vise da validiram token kroz AddAuthentication i AddJwtBearer. A ne znam sta se unutra desava pa da promenim. Nisam siguran kako ovaj custom metod sto imam da uguram u AddAuthentication. Negde kazu treba napraviti neku posebnu klasu koja bi se u konfiguraciji pokretala kao middleware.

Da li je ovo uopste dovoljno secure resenje kako sad radi, da mi sve metode u Hub-u butu neautorizovane, a u njima da eksplicitno pozivam ovu validate metodu i proveravam token? Da li je ok prosledjivati token tako samo kao jedan od parametara funkcije?
rs.ceevee.com/nenad.curcic
 
Odgovor na temu

dejanet
Beograd

Član broj: 19240
Poruke: 1181



+835 Profil

icon Re: ASP.NET Core Authentikacija i SignalR07.06.2019. u 12:29 - pre 58 meseci
Mislim da je ispravan nacin preko AddAuthentication/AddJwtBearer u Startup.cs.

Od prilike ovako nesto:


Code:
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(jwt =>
                                  {
                                      jwt.RequireHttpsMetadata = false;
                                      jwt.SaveToken = true;
                                      jwt.TokenValidationParameters = new TokenValidationParameters
                                      {
                                          ValidateAudience = false,
                                          ValidateIssuer = false,
                                          ValidateActor = false,
                                          ValidateLifetime = true,
                                      };
                                      jwt.Events = new JwtBearerEvents
                                      {
                                          OnMessageReceived = context =>
                                                         {
                                                             var tokenValue = context.Request.Query["access_token"];
                                                             if (VerifyToken(tokenValue))
                                                             {
                                                                   context.Token = tokenValue 
                                                             }
                                                             return Task.CompletedTask;
                                                         }
                                      };
                                  });

                      services.AddSignalR();
                      services.AddMvc(});
        }


Metode na server side mozes da delis na public i "protected" dodajuci il ne [Authorize] atribut pre metoda (nisam 100% siguran za SignalR).


[Ovu poruku je menjao dejanet dana 07.06.2019. u 13:55 GMT+1]
 
Odgovor na temu

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Re: ASP.NET Core Authentikacija i SignalR07.06.2019. u 13:27 - pre 58 meseci
Citat:
cure126:
Da li je ovo uopste dovoljno secure resenje kako sad radi, da mi sve metode u Hub-u butu neautorizovane, a u njima da eksplicitno pozivam ovu validate metodu i proveravam token? Da li je ok prosledjivati token tako samo kao jedan od parametara funkcije?


Generalno nije dobro, jer nekad ces zaboraviti da dodas tu tvoju validaciju i otici ce nezasticeno. Tj nije ok da je tvoja odgovornost da unutar svake metode vodis racuna.
Odnosno pravilno je da ti platforma i interni mehanizam tog Signalr cuvaju ledja i da to na jednom mestu u inicijalizaciji postavis i posle si miran.
 
Odgovor na temu

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.static.isp.telekom.rs.



+2 Profil

icon Re: ASP.NET Core Authentikacija i SignalR07.06.2019. u 13:34 - pre 58 meseci
A kako iz tokena onda da prosledim pravilno claimove u svaku rutu, kada vec radim validaciju u ovom startup.cs? Imam neke podatke u tokenu koji su mi bitni ako je validan.
(Sad cu da probam prvo ovu validaciju ovako)
rs.ceevee.com/nenad.curcic
 
Odgovor na temu

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Re: ASP.NET Core Authentikacija i SignalR10.06.2019. u 11:37 - pre 58 meseci

Trebalo bi da imas pristup kontekstu u svakoj metodi...
https://docs.microsoft.com/en-...iew/security/hub-authorization
 
Odgovor na temu

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.static.isp.telekom.rs.



+2 Profil

icon Re: ASP.NET Core Authentikacija i SignalR10.06.2019. u 11:48 - pre 58 meseci
Napravio sam da kupim Claim u metodi Huba, tacno, preko kontexta.

E sad sam otkrio da dok traje konekcija, token je uvek validan, makar mu vremenom istekao rok? Da li to znaci da opet moram na stari nacin metodom da ga unutar metode haba?
Drugo pitanje, kako pravilno iz ASP.NET Core da vratim klijentu zasto mu je token nevalidan? Uvek se vraca authorization failed, makar token bio i validan samo istekao?
Probao sam u konfiguraciju da ubacim u UseExceptionHandler ovo samo modifikujem da hvata SecurityTokenExpiredException:

Code:

app.UseExceptionHandler(a => a.Run(async context =>
      {
        var feature = context.Features.Get<IExceptionHandlerPathFeature>();
        var exception = feature.Error;

        var result = JsonConvert.SerializeObject(new { error = exception.Message });
        context.Response.ContentType = "application/json";
        await context.Response.WriteAsync(result);
      }));


I jos neke varijante kao na primer da se napravi error handler middleware (primer), ali nista ne hvata Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException exceptione.
rs.ceevee.com/nenad.curcic
 
Odgovor na temu

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.static.isp.telekom.rs.



+2 Profil

icon Re: ASP.NET Core Authentikacija i SignalR20.06.2019. u 08:40 - pre 58 meseci
Citat:
djordjeno:
Citat:
cure126:
Da li je ovo uopste dovoljno secure resenje kako sad radi, da mi sve metode u Hub-u butu neautorizovane, a u njima da eksplicitno pozivam ovu validate metodu i proveravam token? Da li je ok prosledjivati token tako samo kao jedan od parametara funkcije?


Generalno nije dobro, jer nekad ces zaboraviti da dodas tu tvoju validaciju i otici ce nezasticeno. Tj nije ok da je tvoja odgovornost da unutar svake metode vodis racuna.
Odnosno pravilno je da ti platforma i interni mehanizam tog Signalr cuvaju ledja i da to na jednom mestu u inicijalizaciji postavis i posle si miran.


Sve zaboravih da odgovorim, ali ASP.NET Core je ocajan u ovoj autorizaciji kada je SignalR i web soket u pitanju. Znaci on validira token jednom kada se konekcija ostvari i u medjuvremenu token moze i da istekne, dokle god traje konekcija svaki zahtev ce biti validan. Ta asp.net core autentikacija kroz starup.cs je pravljena za REST gde je svaki zahtev prakticno nova konekcija pa se ponovo proverava token. Dakle moj zakljucak je na SIgnalR raditi rucno validaciju na svakom endpointu koji treba da bude zasticen tokenom... A sto je najgore, nemoguce je i zameniti token u toku trajanja konekcije nego mora da se uradi diskonekt od strane klijenta, pa zameni token pa opet konektuje.

rs.ceevee.com/nenad.curcic
 
Odgovor na temu

pl4stik
Senior .NET programmer/Consultant
oDesk
NI na nebu NI na zemlji

Član broj: 173596
Poruke: 715
*.exe-net.net.

Sajt: xx-auth.com.azhar.arvixe...


+31 Profil

icon Re: ASP.NET Core Authentikacija i SignalR09.01.2020. u 10:49 - pre 51 meseci
Jeste mozda malo kasno al cisto za ubuduce...
Nista nije ocajno, sve je normalno i isto to moras da radis i na primer sa Sockets.io u Node-u ...
Sve zavisi koji protokol ces iz SignalR-a da koristis jer npr. WebSockets nema header pa bi trebao da napravis custom validaciju tj. ili kroz querystring ili kroz body. Znaci token proveravas za svaki request ...

Moj neki nacin za proveru iz query stringa za .NET framework koji sam svojevremeno pokupio sa neta negde

Code:

    public class QueryStringBearerAuthorizeAttribute : AuthorizeAttribute
    {
        public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
        {
            var dataProtectionProvider = new DpapiDataProtectionProvider();
            var secureDataFormat = new TicketDataFormat(dataProtectionProvider.Create());
            // authenticate by using bearer token in query string
            var token = request.QueryString.Get("access_token");

            JwtWriterFormat jwt = new JwtWriterFormat();
            var ticket = jwt.Unprotect(token);
            //var ticket = secureDataFormat.Unprotect(token);
            if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated)
            {
                // set the authenticated user principal into environment so that it can be used in the future
                request.Environment["server.User"] = new ClaimsPrincipal(ticket.Identity);
                return true;
            }
            else
            {
                return false;
            }
        }

        public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
        {
            var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId;
            // check the authenticated user principal from environment
            var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment;
            var principal = environment["server.User"] as ClaimsPrincipal;
            if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated)
            {
                // create a new HubCallerContext instance with the principal generated from token
                // and replace the current context so that in hubs we can retrieve current user identity
                hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment), connectionId);
                return true;
            }
            else
            {
                return false;
            }
        }
    }



Code:

            app.Map("/signalr", delegate (IAppBuilder map)
            {
                map.UseCors(CorsOptions.AllowAll);
                HubConfiguration configuration = new HubConfiguration
                {
                    EnableDetailedErrors = true
                };
                QueryStringBearerAuthorizeAttribute queryStringBearerAuthorizeAttribute = new QueryStringBearerAuthorizeAttribute();
                AuthorizeModule pipelineModule = new AuthorizeModule(queryStringBearerAuthorizeAttribute, queryStringBearerAuthorizeAttribute);
                GlobalHost.HubPipeline.AddModule(pipelineModule);
                map.RunSignalR(configuration);
            });


Mozes i da pravis sa cookie auth ali su za njih ne mozes da isklucis CORS pa ces da imas problem pre ili kasnije ako su ti JS klijenti, etc...
To sto nekoliko miliona ljudi tvrdi da nisi u pravu ne znaci da stvarno nisi - Frank Zappa

https://youtu.be/DLe358DPGXU
 
Odgovor na temu

cure126
Srbija, Uzice

Član broj: 67027
Poruke: 227
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: ASP.NET Core Authentikacija i SignalR09.01.2020. u 10:53 - pre 51 meseci
Jeste kasno, više ne radim na tom projektu. :)

Inače, prvo je napravljen mehanizam za proveru tokena na svakom requestu, ali onda se našao neko ko je rekao "ne ne ne, homećmo da koristimo ASP.NET autentikaciju" pa je ostalo da se token proverava samo kada se klijent prvi put konektuje, dalje ništa.

Hvala u svakom slučaju...
rs.ceevee.com/nenad.curcic
 
Odgovor na temu

[es] :: .NET :: ASP.NET :: ASP.NET Core Authentikacija i SignalR

[ Pregleda: 1889 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.