2017-02-18 17 views
3

Когда я пытаюсь получить доступ к Context.User в моем концентраторе, я продолжаю получать Context.User - это нулевые ошибки. Я попытался переместить app.MapSignalR() в ConfigureAuth(), но это не приводит к тому, что SignalR вообще не отображается. Я не уверен, где мне нужно передать мой файл cookie в SignalR.Null Context.User

SignalR работает в моем приложении для отправки сообщения всех пользователей, я просто не могу получить OnConnect переопределения работать без Context.User

Startup.CS

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 
     ConfigureAuth(app); 

    } 
} 

Startup.Auth. CS

public partial class Startup 
{ 
    private static string clientId =  ConfigurationManager.AppSettings["ida:ClientId"]; 
    private static string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"]; 
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
    private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"]; 
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; 
    private static string authority = aadInstance + tenantId; 

    public void ConfigureAuth(IAppBuilder app) 
    { 

     app.MapWhen(context => !IsDataPath(context.Request), appBuilder => 
     { 
      appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

      appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions()); 

      appBuilder.UseOpenIdConnectAuthentication(
       new OpenIdConnectAuthenticationOptions 
       { 
        //AuthenticationMode = AuthenticationMode.Passive, 
        ClientId = clientId, 
        Authority = authority, 
        PostLogoutRedirectUri = postLogoutRedirectUri, 

        Notifications = new OpenIdConnectAuthenticationNotifications() 
        { 
         SecurityTokenValidated = (context) => 
         { 
          var claimsIdentity = context.AuthenticationTicket.Identity; 
          CleanupClaims(claimsIdentity); 
          AddHboClaims(claimsIdentity); 
          context.AuthenticationTicket.Properties.ExpiresUtc = DateTime.Now.AddDays(1).ToUniversalTime(); 
          return Task.CompletedTask; 
         }, 
         AuthenticationFailed = (context) => 
         { 
          if (context.Exception.Message.StartsWith("OICE_20004") || context.Exception.Message.Contains("IDX10311")) 
          { 
           context.SkipToNextMiddleware(); 
           return Task.FromResult(0); 
          } 
          return Task.FromResult(0); 
         }, 
        } 
       }); 
     }); 
    } 

    private bool IsDataPath(Microsoft.Owin.IOwinRequest request) 
    { 
     return request.Path.Value.StartsWith("/data"); 
    } 

    private void CleanupClaims(ClaimsIdentity claimsIdentity) 
    { 
     //Remove long unecessary claim types to make the cookie smaller 
     claimsIdentity.RemoveClaim(ClaimTypes.Surname); 
     claimsIdentity.RemoveClaim(ClaimTypes.GivenName); 
     claimsIdentity.RemoveClaim("onprem_sid"); 
     claimsIdentity.RemoveClaim("http://schemas.microsoft.com/identity/claims/tenantid"); 
     claimsIdentity.RemoveClaim("http://schemas.microsoft.com/claims/authnmethodsreferences"); 
     claimsIdentity.RemoveClaim("ipaddr"); 
    } 

    private void AddHboClaims(ClaimsIdentity claimsIdentity) 
    { 
     var depResolver = AutofacDependencyResolver.Current; 
     var permissionRespository = (IUserPermissionsRepository)depResolver.GetService(typeof(IUserPermissionsRepository)); 
     var emailClaim = claimsIdentity.FindFirst(ClaimTypes.Upn); 
     var userPermissions = permissionRespository.GetPermissionForUser(emailClaim.Value); 
     foreach (var permission in userPermissions) 
     { 
      claimsIdentity.AddClaim(HboClaimsNames.Permission, ((int)permission).ToString()); 
     } 

     var db = (Database.HboDbContext)depResolver.GetService(typeof(Database.HboDbContext)); 
     var resource = db.Resources.SingleOrDefault(r => r.HmbEmail == emailClaim.Value); 
     if (resource != null) 
     { 
      //if (resource.IsActive) 
      //{ 
       claimsIdentity.AddClaim(HboClaimsNames.ResourceId, resource.Id.ToString()); 
      //} 
      //else 
      //{ 
      // var ex = new Exception("Inactive user attempting to log into HBO: " + emailClaim.Value); 
      // Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
      //  
      //} 
     } 
     else 
     { 
      var ex = new Exception("User attempting to log into HBO that is not in Db: " + emailClaim.Value); 
      Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
     } 
    } 
} 

ответ

2

Вы должны изменить это:

public void Configuration(IAppBuilder app) 
{ 
    app.MapSignalR();   
    ConfigureAuth(app); 
} 

Для этого:

public void Configuration(IAppBuilder app) 
{ 
    ConfigureAuth(app); 
} 

И позвоните MapSignalR() внутри вашего ConfigureAuth()

Причины вы не можете просто позвонить MapSignalR() после ConfigureAuth() благодаря этой линии:

app.MapWhen(context => !IsDataPath(context.Request), appBuilder => 

Источник проблема заключается в том, что метод MapWhen() разделяет конвейер запроса и если вы просто вызываете app.MapSignalR() в Owin При запуске вы будете инициализировать SignalR в неправильном конвейере запроса.

Таким образом, ваш ConfigureAuth() метод должен выглядеть примерно так:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.MapWhen(context => !IsDataPath(context.Request), appBuilder => 
    { 
     appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     appBuilder.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = clientId, 
       Authority = authority, 
       PostLogoutRedirectUri = postLogoutRedirectUri, 

       Notifications = new OpenIdConnectAuthenticationNotifications() 
       { 
        SecurityTokenValidated = (context) => 
        { 
         ... 
        }, 
        AuthenticationFailed = (context) => 
        { 
         ... 
        }, 
       } 
      }); 

     appBuilder.MapSignalR(); 
    }); 
}