2017-02-18 61 views
3

當我嘗試訪問我的Hub中的Context.User時,我一直得到Context.User爲空錯誤。我嘗試過在ConfigureAuth()下移動app.MapSignalR(),但它導致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()方法分支請求管道,如果您只在Owin中調用app.MapSignalR()啓動時,您將在錯誤的請求管道中初始化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(); 
    }); 
} 
相關問題