SignalR ile Authentication Nasıl Yapılır?


SignalR ile Authentication Nasıl Yapılır?

Gerçek zamanlı web uygulamalarında kimlik doğrulama (authentication) en kritik adımlardan biridir. Özellikle SignalR ile yapılan projelerde, bağlantının güvenli olması için kullanıcı doğrulamasının doğru kurgulanması gerekir. Bu makalede SignalR ile authentication nasıl yapılır, en verimli ve güvenilir yöntemler nelerdir detaylıca ele alacağız.

SignalR ile Authentication Mimarisi

SignalR, istemci ve sunucu arasında sürekli açık iki yönlü bir iletişim hattı kurar. Standart Http API’lerde olduğu gibi SignalR ile de authentication süreci middleware katmanında yürütülür. SignalR, hem Cookie tabanlı hem de JWT Bearer gibi token tabanlı authentication yöntemleriyle kolayca entegre olabilir.

ASP.NET Core SignalR'da JWT Bearer Authentication Örneği

Aşağıda, SignalR hub’ında JWT ile authentication kullanımına dair en basit örneklerden birini bulabilirsiniz. Bu yöntemde, istemciden gelen token, sunucuda doğrulanır ve her bağlantıda kullanıcı bağlamında güvenli şekilde çalışılır.


// Startup.cs içerisinde authentication kurulumu
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "yourdomain.com",
            ValidAudience = "yourdomain.com",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
        };
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                // SignalR ile birlikte gelen access_token'ı al
                var accessToken = context.Request.Query["access_token"];

                // Eğer signalr path ise token'ı kullan
                var path = context.HttpContext.Request.Path;
                if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs/chat"))
                {
                    context.Token = accessToken;
                }
                return Task.CompletedTask;
            }
        };
    });

    services.AddSignalR();
}

İstemci tarafında ise, bağlantı kurarken access_token parametresini göndermek gerekir:


const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/chat", {
        accessTokenFactory: () => token
    })
    .build();

SignalR Authentication'da Dikkat Edilmesi Gerekenler

SignalR ile authentication kullanırken, bağlantı güvenliği için TLS desteği (HTTPS) zorunlu olmalıdır. Ayrıca, kullanıcıdan alınan tokenların süresi, rol/izin kontrolü ve anonim kullanıcıya izin verilip verilmeyeceği detaylıca ele alınmalıdır. Aşağıda bir SignalR hub’ında authentication yapılanmış bir kontrol örneği görebilirsiniz:


public class ChatHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        // Kullanıcı doğrulama kontrolü
        if (!Context.User.Identity.IsAuthenticated)
        {
            Context.Abort();
        }
        await base.OnConnectedAsync();
    }

    public Task SendMessage(string message)
    {
        var userName = Context.User.Identity.Name;
        return Clients.All.SendAsync("ReceiveMessage", userName, message);
    }
}

Sonuç

SignalR ile authentication yapmak, modern web uygulamalarında güvenliği sağlamak için elzemdir. JWT veya cookie tabanlı authentication yöntemleriyle, SignalR ile gerçek zamanlı iletişimde hem güvenliği hem performansı artırmak mümkündür. Özellikle SignalR ile authentication uygulayarak, hassas verilerin yalnızca doğrulanmış ve yetkiye sahip kullanıcılar arasında paylaşılmasını kolayca sağlayabilirsiniz.