2014-05-14 11 views
10

Web API 2 OWIN Bearer token authentication - AccessTokenFormat null?Triển khai OAuth AccessTokenFormat mặc định trong OWIN dành cho máy chủ IIS là gì?

Các default/điểm cuối Mã hoạt động tốt và tôi có thể nhận mã thông báo từ đó, nhưng tôi cần phải sử dụng các phương pháp AccessTokenFormat.Protect trên vé để tạo accessToken cho externalLogin.

Về cơ bản triển khai thực hiện của tôi khá giống với phiên bản này và tôi gặp phải cùng một vấn đề của AccessTokenFormat là rỗng. Từ documentation nó nói: định dạng

Dữ liệu dùng để bảo vệ thông tin chứa trong thẻ truy cập. Nếu không được cung cấp bởi ứng dụng, nhà cung cấp bảo vệ dữ liệu mặc định tùy thuộc vào máy chủ lưu trữ. Máy chủ SystemWeb trên IIS sẽ sử dụng bảo vệ dữ liệu khóa máy ASP.NET, và HttpListener và các máy chủ tự lưu trữ khác sẽ sử dụng bảo vệ dữ liệu DPAPI. Nếu một nhà cung cấp mã thông báo truy cập hoặc định dạng truy cập khác được chỉ định, một phiên bản tương thích phải được gán cho thuộc tính OAuthBearerAuthenticationOptions.AccessTokenProvider hoặc OAuthBearerAuthenticationOptions.AccessTokenFormat của máy chủ tài nguyên.

Dường như với tôi rằng nếu AccessTokenFormat không được chỉ định, máy chủ sẽ cung cấp triển khai cơ bản cho nó. Nhưng tôi không thấy nó hoạt động ở đây. Có cách nào tôi có thể tìm thấy cài đặt mặc định của ISecureDataFormatAccessTokenFormat và gán nó cho biến theo cách thủ công không?

Hoặc có ai có ý tưởng khác về cách giải quyết vấn đề này không?

UPDATE: Tôi lấy mã nguồn cho katana và tìm thấy những lớp OAuthAuthorizationServerMiddleware, từ mã nguồn tôi có thể thấy đoạn mã sau:

if (Options.AccessTokenFormat == null) 
     { 
      IDataProtector dataProtecter = app.CreateDataProtector(
       typeof(OAuthAuthorizationServerMiddleware).Namespace, 
       "Access_Token", "v1"); 
      Options.AccessTokenFormat = new TicketDataFormat(dataProtecter); 
     } 

Trong Startup.Auth của tôi, đây là mã của tôi:

 static Startup() 
    { 
     PublicClientId = "self"; 

     UserManagerFactory =() => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 

     OAuthOptions = new OAuthAuthorizationServerOptions() 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }; 

     OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
     OAuthBearerOptions.AccessTokenFormat = OAuthOptions.AccessTokenFormat; 
     OAuthBearerOptions.AccessTokenProvider = OAuthOptions.AccessTokenProvider; 
     OAuthBearerOptions.AuthenticationMode = OAuthOptions.AuthenticationMode; 
     OAuthBearerOptions.AuthenticationType = OAuthOptions.AuthenticationType; 
     OAuthBearerOptions.Description = OAuthOptions.Description; 

     OAuthBearerOptions.Provider = new CustomBearerAuthenticationProvider(); 
     OAuthBearerOptions.SystemClock = OAuthOptions.SystemClock; 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     // Configure the db context and user manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 


     app.UseOAuthAuthorizationServer(OAuthOptions); 

     // Enable the application to use bearer tokens to authenticate users 
     app.UseOAuthBearerTokens(OAuthOptions); 
     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 
     // Use a cookie to temporarily store information about a user logging in with a third party login provider 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

}

tôi cũng có những điều sau đây trong WebApiConfig

// Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

Tôi không chắc chắn lý do tại sao app.UseOAuthAuthorizationServer(OAuthOptions); không thiết lập các accessTokenFormat

Trả lời

10

Tôi không chắc chắn lý do tại sao nó không được thiết lập một cách chính xác, nhưng tôi kéo ra mã và gán cho nó tự của tôi. Đây là mã làm việc cuối cùng của tôi trông giống như:

 public void ConfigureAuth(IAppBuilder app) 
    { 
     // Configure the db context and user manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 


     OAuthOptions = new OAuthAuthorizationServerOptions() 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
      AccessTokenFormat = new TicketDataFormat(app.CreateDataProtector(
       typeof(OAuthAuthorizationServerMiddleware).Namespace, 
       "Access_Token", "v1")), 
      RefreshTokenFormat = new TicketDataFormat(app.CreateDataProtector(
       typeof(OAuthAuthorizationServerMiddleware).Namespace, 
       "Refresh_Token", "v1")), 
      AccessTokenProvider = new AuthenticationTokenProvider(), 
      RefreshTokenProvider = new AuthenticationTokenProvider(), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }; 

     OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
     OAuthBearerOptions.AccessTokenFormat = OAuthOptions.AccessTokenFormat; 
     OAuthBearerOptions.AccessTokenProvider = OAuthOptions.AccessTokenProvider; 
     OAuthBearerOptions.AuthenticationMode = OAuthOptions.AuthenticationMode; 
     OAuthBearerOptions.AuthenticationType = OAuthOptions.AuthenticationType; 
     OAuthBearerOptions.Description = OAuthOptions.Description; 

     OAuthBearerOptions.Provider = new CustomBearerAuthenticationProvider(); 
     OAuthBearerOptions.SystemClock = OAuthOptions.SystemClock; 

     app.UseOAuthAuthorizationServer(OAuthOptions); 
     app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 
     // Use a cookie to temporarily store information about a user logging in with a third party login provider 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
     } 
Các vấn đề liên quan