asp.net-web-api – 从ASP.NET WebAPI 2中的头和/或查询字符串中
背景:
我有一个ASP.NET WebAPI项目.我正在使用Bearer Tokens来验证我的用户.我的一些控制器操作标有[授权]过滤器.在客户端,客户端通过调用http://foo.bar/Token然后将该令牌作为Authorization标头添加到其请求中来获取其令牌. 到目前为止没有问题,并且我的Startup.Auth.cs类中的所有设置都正常工作: OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"),Provider = new ApplicationOAuthProvider(PublicClientId),AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),// In production mode set AllowInsecureHttp = false AllowInsecureHttp = true }; // Enable the application to use bearer tokens to authenticate users app.USEOAuthBearerTokens(OAuthOptions); 现在我已经为我的项目添加了一些SignalR集线器,我也想验证集线器中的用户.还有一些其他问题涉及客户端如何向SignalR连接添加承载令牌.摘要: >一种方式是adding it as an ajax default header,由于the JS WebSocket API does not make it possible to set custom headers.的事实而气馁.所以你回退到使用“长轮询”. (不是我想要的) 我试过的: 所以我创建了这个类来从查询字符串中检索我的访问令牌. public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider { public override Task RequestToken(OAuthRequestTokenContext context) { var value = context.Request.Query.Get("access_token"); if (!string.IsNullOrEmpty(value)) { context.Token = value; } return Task.FromResult<object>(null); } } 然后在客户端,我这样做是为了传递我的访问令牌: var connection = $.hubConnection(); var hub = connection.createHubProxy('fooHub'); connection.qs = { 'access_token': myAccessToken}; // Init connection 这是一个想法,但是当我想在Startup.Auth.cs类中注册QueryStringOAuthBearerProvider时会出现问题. 以下是我更改Startup.Auth.cs类的方法: OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"),// In production mode set AllowInsecureHttp = false AllowInsecureHttp = true }; // Enable the application to use bearer tokens to authenticate users app.USEOAuthBearerTokens(OAuthOptions); // Enable the application to retrieve tokens from query string to authenticate users app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() { Provider = new QueryStringOAuthBearerProvider() }); 所以我想我现在可以使用: >默认承载令牌,它位于我的WebAPI调用请求的标头中. 结果: 当我连接到我的集线器时,我可以从查询字符串中检索访问令牌,并对用户进行身份验证.但是当我尝试调用WebAPI控制器操作时,我得到System.InvalidOperationException,表示Sequence包含多个元素.我认为这是因为我正在注册两种方式通过承载令牌验证我的用户,OWIN不喜欢这样. 题: 我怎样才能有两种方法来获得持票人令牌? > WebApi调用的默认行为(授权标头) 请注意,我不想将访问令牌作为查询字符串传递给我的WebApi操作,而只是传递给SignalR Hub. 解决方法
在盲目地寻找答案的同时,我遇到了一个与我的问题有点类似的
post,并且在评论名称为mahmoud的评论中说道:
它适用于我的情况,现在我可以使用这两种方法获得持票人令牌.这是我修改过的Startup.Auth.cs类: OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"),// In production mode set AllowInsecureHttp = false AllowInsecureHttp = true }; // Enable the application to use bearer tokens to authenticate users //app.USEOAuthBearerTokens(OAuthOptions); // Commented this line. app.USEOAuthAuthorizationServer(OAuthOptions); // Added this line // Enable the application to retrieve tokens from query string to authenticate users app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() { Provider = new QueryStringOAuthBearerProvider() }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET Web API中除IQueryable之外的OData查询和类型
- asp.net下创建、查询、修改带名称空间的 XML 文件的例子
- asp.net-mvc – ASP.NET MVC是否有任何DateTime路由约束?
- ASP.NET Identity简介及简单使用
- asp.net-mvc – 是否由Razor支持lambda表达式?
- asp.net-mvc-4 – 如何在Durandal中使用cshtml文件?
- asp.net-mvc – 资源解释为Document但使用MIME类型applicat
- asp.net-mvc – asp.net MVC 1.0和2.0货币模型绑定
- asp.net-web-api – 间歇性“无法加载类型”System.Net.Htt
- asp.net-mvc – 如何在ASP.NET MVC部分视图中使用匿名列表作
- .net – 关于强名称验证跳过的奇怪问题
- asp.net-mvc – 使用ASP.NET Identity 2.0 UserM
- asp.net-mvc – ASP.NET MVC Html.DropDownList由
- asp.net-mvc – 如何锁定ASP.NET MVC中的路径?
- 深入理解C# 3.x的新特性(2):Extension Method
- asp.net-mvc – 在OWIN登录上检索用户的Facebook
- asp.net – 什么是LiteralControl?为什么使用
- 如何使用ASP.NET C#设置html输入类型文本值?
- asp.net-mvc – 如何在ASP.NET MVC的所有操作中安
- asp.net signalR 专题—— 第三篇 如何从外部线程