2015-08-16 4 views
3

Для моего проекта тезисов я должен реализовать аутентификацию на основе токенов (Bearer) в своем решении ASP.NET. Я реализовал его как Taiseer Jouseh (http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity).Идентификатор ASP.NET равен нулю, даже если токен отправлен

Основная часть работает правильно. У меня есть мобильный клиент, на котором я могу зарегистрировать нового пользователя. Затем я могу войти и получить токен. Когда я делаю запрос, токен отправляется в заголовке запроса. Все работает отлично. Моя проблема заключается в том, что я получаю 401 Несанкционированную ошибку, если я вызываю метод [Авторизовать], даже если я отправляю токен. Поэтому я удалил [Авторизовать] аннотацию, чтобы проверить некоторые вещи:

var z = User.Identity; 
var t = Thread.CurrentPrincipal.Identity; 
var y = HttpContext.Current.User.Identity; 
var x = Request.GetOwinContext().Authentication.User.Identity; 

Здесь я получил alwas тот же Идентичность: AuthenticationType = NULL; IsAuthenticated = ложь; Name = NULL; Претензии: пусто

var token = Request.Headers.Authorization; 

Здесь я получаю правый токен. Таким образом, токен отправляется по запросу.

Надеюсь, вы можете мне помочь. У меня есть токен, но нет личности.

Вот часть моего кода: OAuthServiceProvider:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 

    public async override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    // POST /token 
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     var userManager = DependencyResolver.Current.GetService<UserManager<IdentityUser, int>>(); 

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

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

     var identity = await userManager.CreateIdentityAsync(user, context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 
     context.Validated(identity); 
    } 
} 

Метод управления:

#region GET /user/:id 
[HttpGet] 
[Route("{id:int:min(1)}")] 
[ResponseType(typeof(UserEditDto))] 
public async Task<IHttpActionResult> GetUser(int id) 
{ 
    try 
    { 
     // tests 
     var z = User.Identity; 
     var t = Thread.CurrentPrincipal.Identity; 
     var y = HttpContext.Current.User.Identity; 
     var x = Request.GetOwinContext().Authentication.User.Identity; 
     var token = Request.Headers.Authorization; 

     User user = await _userManager.FindByIdAsync(id); 
     if (user == null) 
     { 
      return NotFound(); 
     } 

     Mapper.CreateMap<User, UserEditDto>(); 
     return Ok(Mapper.Map<UserEditDto>(user)); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 

} 
#endregion 

WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter("Bearer")); 

     config.MapHttpAttributeRoutes(); 

     var corsAttr = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(corsAttr); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

запуска:

[assembly: OwinStartup(typeof(Startup))] 
public class Startup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     var container = new UnityContainer(); 
     UnityConfig.RegisterComponents(container); 
     config.DependencyResolver = new UnityDependencyResolver(container); 
     //config.DependencyResolver = new UnityHierarchicalDependencyResolver(container); 
     WebApiConfig.Register(config); 
     app.UseWebApi(config); 
     ConfigureOAuth(app); 
    } 

    public void ConfigureOAuth(IAppBuilder app) 
    { 
     OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new SimpleAuthorizationServerProvider() 
     }; 

     // Token Generation 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
     app.UseOAuthAuthorizationServer(OAuthServerOptions); 

    } 

} 

ответ

10

Наконец-то я нашел проблему. Это так просто, что я не могу поверить, что провел больше недели, чтобы решить эту проблему.

Проблема была в старте. Я просто должен был назвать ConfigureOAuth(app); до того app.UseWebApi(config);

Так правильный запуск выглядит

[assembly: OwinStartup(typeof(Startup))] 
public class Startup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     var container = new UnityContainer(); 
     UnityConfig.RegisterComponents(container); 
     config.DependencyResolver = new UnityDependencyResolver(container); 
     //config.DependencyResolver = new UnityHierarchicalDependencyResolver(container); 
     WebApiConfig.Register(config); 
     ConfigureOAuth(app); 
     app.UseWebApi(config); 
    } 

    public void ConfigureOAuth(IAppBuilder app) 
    { 
     OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new SimpleAuthorizationServerProvider() 
     }; 

     // Token Generation 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
     app.UseOAuthAuthorizationServer(OAuthServerOptions); 

    } 

} 
+0

Не могу поверить, что заказ вызовов метода может нанести столько урона. Я бил себя, пока не попробовал ваше решение и не ударил ... это работает. –

+0

Это спасло меня так много времени. Пожизненный урок, я думаю .. – Alok

0

Я предполагаю, что токен не отправляется правильно от клиента. Вы отправляете токен авторизации со словом «носитель» с префиксом спереди?

Авторизации Заголовок должен быть чем-то вроде ниже -

Authorization:Bearer reNjoIUZBJHCMigQJHzCgMMVUyu4vg 

Посмотрите на вкладке Инструменты разработчика Chrome сети, чтобы увидеть, что было отправлено.

+0

Спасибо за ваш ответ. Да, я всегда работаю с Google DevTools, и заголовок был правильно установлен в запросе. –

Смежные вопросы