2016-09-01 12 views
1

Есть ли способ прочитать/расшифровать токен-носитель в веб-проекте api?Идентификатор знака дешифрования в веб-интерфейсе API

В моем веб-афере также есть концентраторы SignalR, которые вызывается из браузера через websocket. В отличие от обычных вызовов api я не могу добавить здесь заголовок авторизации. Хотя я могу отправить токен в строку запроса и прочитать это в концентраторе SignalR.

По умолчанию токен разрешен owin в идентификатор претензии. Мне нужно сделать это вручную. Как мне это сделать?

OAuthAuthorizationServerOptions serverOptions = new OAuthAuthorizationServerOptions() 
    { 
     AllowInsecureHttp = true, 
     TokenEndpointPath = new PathString("/token"), 
     AccessTokenExpireTimeSpan = TimeSpan.FromDays(Config.TokenLifetime), 
     Provider = new AuthProvider() 
    }; 

    // Token Generation 
    app.UseStageMarker(PipelineStage.Authenticate); // wait for authenticate stage, so we get the windows principle for use with ntlm authentication 
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
    app.UseOAuthAuthorizationServer(serverOptions); 
+0

вы используете OAuthBearerAuthenticationOptions генерировать маркеры? –

+1

Один из способов - сохранить поставщика проверки подлинности в статической переменной в классе запуска owin и вызвать его, когда вам нужно получить претензии от токена. –

+0

@ Nikola.Lukovic: yes –

ответ

2

Я предполагаю, что в Startup.cs у вас есть код, подобный этому:

var oAuthOpt = new OAuthBearerAuthenticationOptions 
{ 
    Provider = new OAuthTokenProvider(
     req => req.Query.Get("bearer_token"), 
     req => req.Query.Get("access_token"), 
     req => req.Query.Get("refresh_token"), 
     req => req.Query.Get("token"), 
     req => req.Headers.Get("X-Token")) 
}; 

app.UseOAuthBearerAuthentication(OAuthOpt); 

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString(settings.TokenEndpointBasePath), 
    AccessTokenExpireTimeSpan = Util.AccessTokenExpireTimeSpan, 
    Provider = new AuthorizationServerProvider(new AuthenticationService()), 
}); 

То, что вы должны сделать, это заменить oAuthOpt с публичным статическим полем в Startup.cs и чем использовать его, когда вам нужно для снятия защиты с ваших жетонов-носителей.

Для SignalR я создаю атрибут авторизации, где я беру это oAuthOpt и использую его для декодирования жетонов.

Это, как я это делаю:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
public sealed class AuthorizeHubAttribute : AuthorizeAttribute 
{ 
    public override bool AuthorizeHubConnection (HubDescriptor hubDescriptor, IRequest request) 
    { 
     var token = request.QueryString["Authorization"]; 
     var ticket = Startup.OAuthOpt.AccessTokenFormat.Unprotect(token); 
     if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated) 
     { 
      request.Environment["server.User"] = new ClaimsPrincipal(ticket.Identity); 
      return true; 
     } 
     else 
      return false; 
    } 

    public override bool AuthorizeHubMethodInvocation (IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId; 
     var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment; 
     var principal = environment["server.User"] as ClaimsPrincipal; 
     if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated) 
     { 
      hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new Microsoft.AspNet.SignalR.Owin.ServerRequest(environment), connectionId); 
      return true; 
     } 
     else 
      return false; 
    } 
} 

вар билет = Startup.OAuthOpt.AccessTokenFormat.Unprotect (маркер);

Эта линия является связь с Startup.cs

+0

Спасибо за ваше решение! К сожалению, это не полностью работает для меня: в AuthorizeHubConnection билет по какой-то причине является нулевым. Однако маркер правильно извлекается из запроса. Как выглядит ваша токена в строке выше? Mine имеет формат «Bearer » –

+1

вы можете попробовать удалить «несущий» из строки и передать его методу «Снять защиту» –

+0

Хорошо, я просто отрезал сторону носителя и теперь это работает! Бесконечно благодарен! –