2015-05-26 17 views
8

Tôi có một số vấn đề với việc áp dụng Nhận dạng Web API 2. Trong dự án.Nhận dạng Web API 2./Mã thông báo Luôn trả lại lỗi 404

tôi thêm StartUp.cs

Như thế này:

using Microsoft.Owin; 
using Owin; 

[assembly: OwinStartup(typeof(MyNamespace.Startup))] 
namespace MyNamespace 
{ 
    public partial class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       ConfigureAuth(app); 
      } 
     } 
} 

Sau đó tôi thêm partial class cho phép uỷ quyền Mã:

namespace MyNamespace 
{ 
    public partial class Startup 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 
     public static string PublicClientId { get; private set; } 
     public void ConfigureAuth(IAppBuilder app) 
     { 
      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

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

      app.UseOAuthBearerTokens(OAuthOptions); 
     } 
    } 
} 

Tương tự như vậy tôi thực hiện chức năng tài khoản (như UserStore, UserManager).

Tôi lấy phương pháp "ExternalLogin" từ ví dụ và thay đổi.

// GET api/Account/ExternalLogin 
    [OverrideAuthentication] 
    [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
    [AllowAnonymous] 
    [Route("ExternalLogin", Name = "ExternalLogin")] 
    public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
    { 
     if (error != null) 
     { 
      return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error)); 
     } 

     if (!User.Identity.IsAuthenticated) 
     { 
      return new ChallengeResult(provider, this); 
     } 

     ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

     if (externalLogin == null) 
     { 
      return InternalServerError(); 
     } 

     if (externalLogin.LoginProvider != provider) 
     { 
      Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
      return new ChallengeResult(provider, this); 
     } 

     User user = await UserManager.FindAsync(new UserLoginInfo(externalLogin.LoginProvider, 
      externalLogin.ProviderKey)); 

     bool hasRegistered = user != null; 

     if (hasRegistered) 
     { 
      Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 



      ClaimsIdentity oAuthIdentity = await UserManager.CreateIdentityAsync(user, 
           OAuthDefaults.AuthenticationType); 

      ClaimsIdentity cookieIdentity = await UserManager.CreateIdentityAsync(user, 
           CookieAuthenticationDefaults.AuthenticationType); 

      AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName); 
      Authentication.SignIn(properties, oAuthIdentity, cookieIdentity); 
     } 
     else 
     { 
      IEnumerable<Claim> claims = externalLogin.GetClaims(); 
      ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
      Authentication.SignIn(identity); 
     } 

     return Ok(); 
    } 

Sau đó tôi chạy ứng dụng của tôi và đăng nhập cố gắng ứng dụng như thế này:

var loginData = { 
      grant_type: 'password', 
      username: "test", 
      password: "test" 
     }; 

$.ajax({ 
     type: 'POST', 
     url: '/Token', 
     data: loginData 
     }).done(function (data) { 
      alert(data.username); 
      sessionStorage.setItem(tokenKey, data.access_token); 
     }).fail(function (data) { 
      alert(data); 
     }); 

Tôi đã nhận lỗi 404. Tôi thử gửi yêu cầu tùy chỉnh tới/Token qua fiddler và điều này có cùng kết quả. Sau đó, tôi kiểm tra xem hành động api/Tài khoản/ExternalLogin của tôi có sẵn không, mã trạng thái 401 phản hồi này. Tôi kiểm tra tài liệu tham khảo Owin, Microsoft.Owin tất cả các chính xác. Có chuyện gì vậy? Tôi gặp vấn đề ở đâu?

UPD:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 
{ 
    private readonly string _publicClientId; 

    [Dependency] 
    public ICustomUserManager UserManager 
    { 
     get;set; 
    } 

    public ApplicationOAuthProvider(string publicClientId) 
    { 
     if (publicClientId == null) 
     { 
      throw new ArgumentNullException("publicClientId"); 
     } 

     _publicClientId = publicClientId; 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ICustomUserManager>(); 

     User user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await UserManager.CreateIdentityAsync(user, 
           OAuthDefaults.AuthenticationType); 

     ClaimsIdentity cookieIdentity = await UserManager.CreateIdentityAsync(user, 
           CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = CreateProperties(user.UserName); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 

     var val = context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookieIdentity); 
    } 

    public override Task TokenEndpoint(OAuthTokenEndpointContext context) 
    { 
     foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) 
     { 
      context.AdditionalResponseParameters.Add(property.Key, property.Value); 
     } 

     return Task.FromResult<object>(null); 
    } 

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     // Resource owner password credentials does not provide a client ID. 
     if (context.ClientId == null) 
     { 
      context.Validated(); 
     } 

     return Task.FromResult<object>(null); 
    } 

    public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) 
    { 
     if (context.ClientId == _publicClientId) 
     { 
      Uri expectedRootUri = new Uri(context.Request.Uri, "/"); 

      if (expectedRootUri.AbsoluteUri == context.RedirectUri) 
      { 
       context.Validated(); 
      } 
     } 

     return Task.FromResult<object>(null); 
    } 

    public static AuthenticationProperties CreateProperties(string userName) 
    { 
     IDictionary<string, string> data = new Dictionary<string, string> 
     { 
      { "userName", userName } 
     }; 
     return new AuthenticationProperties(data); 
    } 
} 
+0

Bạn có thể thêm mã của phương thức "ApplicationOAuthProvider" của mình không? –

+0

Tôi sử dụng tính thống nhất cho IoC. Và viết lại phần UserManager – CMaker

Trả lời

25

tôi tìm ra trong vấn đề này. OAuthAuthorizationServerOptions có thuộc tính AllowInsecureHttp. Tôi đã sử dụng giao thức http không an toàn. Trong trường hợp này, bạn có thể đặt AllowInsecureHttp = true hoặc bạn có thể thêm bộ lọc Https vào đường dẫn Bộ lọc.

+0

Cảm ơn bạn! Tôi đã có cùng một vấn đề với 'AllowInsecureHttp = System.Diagnostics.Debugger.IsAttached' – boindiil

+0

cảm ơn rất nhiều .... –

Các vấn đề liên quan