对于想了解.NETWebAPI2OWIN承载令牌认证的读者,本文将是一篇不可错过的文章,我们将详细介绍认证令牌操作错误,并且为您提供关于angularjs–WebApi2为承载令牌预检CORS请求、A
对于想了解.NET Web API 2 OWIN承载令牌认证的读者,本文将是一篇不可错过的文章,我们将详细介绍认证令牌操作错误,并且为您提供关于angularjs – Web Api 2为承载令牌预检CORS请求、ASP.NET 5 OAuth承载令牌认证、ASP.NET Core Web API操作的永久承载令牌身份验证、ASP.Net MVC6是否支持OAuth 2承载令牌?的有价值信息。
本文目录一览:- .NET Web API 2 OWIN承载令牌认证(认证令牌操作错误)
- angularjs – Web Api 2为承载令牌预检CORS请求
- ASP.NET 5 OAuth承载令牌认证
- ASP.NET Core Web API操作的永久承载令牌身份验证
- ASP.Net MVC6是否支持OAuth 2承载令牌?
.NET Web API 2 OWIN承载令牌认证(认证令牌操作错误)
我正在.NET Web应用程序中实现Web API 2服务体系结构。使用请求的客户端是纯JavaScript,没有mvc /
asp.net。我正在使用OWIN根据本文尝试启用令牌身份验证,并使用Web API
Sample进行OWIN承载令牌身份验证。授权后,我似乎在身份验证步骤中缺少某些内容。
我的登录名如下:
[HttpPost] [AllowAnonymous] [Route("api/account/login")] public HttpResponseMessage Login(LoginBindingModel login) { // todo: add auth if (login.UserName == "a@a.com" && login.Password == "a") { var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.Name, login.UserName)); AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); var currentUtc = new SystemClock().UtcNow; ticket.Properties.IssuedUtc = currentUtc; ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30)); DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<object>(new { UserName = login.UserName, AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket) }, Configuration.Formatters.JsonFormatter) }; } return new HttpResponseMessage(HttpStatusCode.BadRequest); }
它返回
{ accessToken: "TsJW9rh1ZgU9CjVWZd_3a855Gmjy6vbkit4yQ8EcBNU1-pSzNA_-_iLuKP3Uw88rSUmjQ7HotkLc78ADh3UHA3o7zd2Ne2PZilG4t3KdldjjO41GEQubG2NsM3ZBHW7uZI8VMDSGEce8rYuqj1XQbZzVv90zjOs4nFngCHHeN3PowR6cDUd8yr3VBLdZnXOYjiiuCF3_XlHGgrxUogkBSQ", userName: "a@a.com"}
然后,我尝试Bearer
在AngularJS中的其他请求上设置HTTP标头,例如:
$http.defaults.headers.common.Bearer = response.accessToken;
像这样的API:
[HttpGet] [Route("api/account/profile")] [Authorize] public HttpResponseMessage Profile() { return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<object>(new { UserName = User.Identity.Name }, Configuration.Formatters.JsonFormatter) }; }
但是无论我做什么,这项服务都是“未经授权”的。我在这里想念什么吗?
答案1
小编典典通过使用Bearer +令牌设置标头“ Authorization”来解决,例如:
$http.defaults.headers.common["Authorization"] = ''Bearer '' + token.accessToken;
angularjs – Web Api 2为承载令牌预检CORS请求
一切都在FireFox& IE,但使用Chrome,我的初始登录请求是有时候有空的。
以下是AngularJS服务的电话:
$ http.post(http:// localhost:55483 / token,data,{headers:{‘Content-Type’:’application / x-www-form-urlencoded’}})。success(function(response) ..});
预检要求被“允许访问控制原点”错误地踢回来。
但是,如果我再次单击登录按钮(从而重新发送上述请求)一切正常。
任何想法如何防止/陷阱/处理这个?
PS:我使用LOC
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",new[] { "*" });
在ApplicationOAuthProvider.cs文件中将CORS allow-header放在/ Token请求上,这在IE,FireFox以及有时在Chrome中可以正常工作。
figured this out with help from post by LeftyX on Jun 29:
– Move
this LOCapp.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
to the
FirsT LINE in the ConfigureAuth method of Startup.Auth.cs.
– Then,
REMOVE this LOC
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",
from the GrantResourceOwnerCredentials() method of
new[] { "*" });
ApplicationOAuthProvide.cs.Preflight CORS-request them gets
handled properly,and then the actual requet goes through
谢谢你,救了我整整一天。
因为它发生在许多人身上,我把你的评论给其他人可以看到的答案框。
我不想为此投票。请评论我的答案
谢谢
ASP.NET 5 OAuth承载令牌认证
例如IApplicationBuilder.USEOAuthAuthorizationServer()和IApplicationBuilder. USEOAuthBearerAuthentication()不再存在或者我没有参考?
任何指针都将不胜感激.
解决方法
(更新:我添加了一个github repo代码:here)
这里是我的启动类:(Identityserver v3也运行在Vnext上,稍作调整).通知我有同一个网络应用程序的服务器和网络api.如果您有两个不同的网站项目,那么这也是可以的,但这里是为了演示…
public class Startup { // For more information on how to configure your application,visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app) { app.Map("/core",core => { var factory = InMemoryFactory.Create( users: Users.Get(),clients: Clients.Get(),scopes: Scopes.Get()); var idsrvOptions = new IdentityServerOptions { IssuerUri = "https://idsrv3.com",SiteName = "test vnext Identity server",Factory = factory,SigningCertificate = Certificate.Get(),RequireSsl = false,CorsPolicy = CorsPolicy.AllowAll,Authenticationoptions = new Authenticationoptions { } }; core.UseIdentityServer(idsrvOptions); }); app.Map("/api",api => { api.USEOAuthBearerAuthentication(options => { options.Authority = Constants.AuthorizationUrl; options.MetadataAddress = Constants.AuthorizationUrl + "/.well-kNown/openid-configuration"; options.TokenValidationParameters.ValidAudience = "https://idsrv3.com/resources"; }); api.UseMvc(); }); } }
从这里你可以看到我的IdentityServerV3被映射到’/ core’,并在同一个Web应用程序项目(可能是另一个)中,我有一个web api使用MVC.下面是控制器:
[Authorize] [Route("[controller]")] public class Test : Controller { [HttpGet] public JsonResult Get() { return Json(new { message = "You See this then it's ok auth is :" + User.Identity.IsAuthenticated,}); } }
我已经在我的身份服务器中配置了一个客户端:
new Client { //Resource Owner Flow Client (our web UI) ClientName = "WebUI",Enabled = true,ClientId = "IdentityWebUI",ClientSecrets = new List<ClientSecret> { new ClientSecret("secret".Sha256()) },Flow = Flows.ResourceOwner,AccesstokenType = AccesstokenType.Jwt,AccesstokenLifetime = 3600 }
这里是User(用于InMemory用户):
return new List<InMemoryUser> { new InMemoryUser { Username = "testUser",Password = "testPwd",Subject = "I am the Subject" } };
在fidler中,我发出以下POST以获取一个承载令牌:
POST : http://localhost:4357/core/connect/token User-Agent: fiddler Host: localhost:4357 Content-Length: 67 Content-Type: application/x-www-form-urlencoded Authorization: Basic swrlbnRpdhlXZWJVSTpzZWNyZXQ= grant_type=password&username=testUser&password=testPwd&scope=openid
在响应中你会得到一个Access_token
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSIsImtpZCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSJ9.eyJjbGllbnRfaWQiOiJJZGVudGl0eVdlYlVJIiwic2NvcGUiOiJvcGVuaWQiLCJzdWIiOiJJIGFtIHRoZSBTdWJqZWN0IiwiYW1yIjoicGFzc3dvcmQiLCJhdXRoX3RpbWUiOjE0MjgzOTQ3MzAsImlkcCI6Imlkc3J2IiwiaXNzIjoiaHR0cHM6Ly9pZHNydjMuY29tIiwiYXVkIjoiaHR0cHM6Ly9pZHNydjMuY29tL3Jlc291cmNlcyIsImV4cCI6MTQyODM5ODMzMCwibmJmIjoxNDI4Mzk0NzMwfQ.cbB4YrRXaaRDNw8BjeI4Q1DvXN28xmJScMJBGWCM_zSLcH1i63cQVTmR8X86rGP5VrR0Ly4-EmWZ8911Vh4jc4Ua0Kgz2n7RbmQ6VqQX5Z_lM3F8EIgD81kpUn0v3hhSFW06aJ2Lo1XOZG_re84xGgqre-H4dC0XZR6IQMEAQ9Q5dOXBh8V1NxyLSh0PzyrRRmOnEndoaY4uaiftbp9j7knxxQ3ZdGmaYAO96xuhHfO1DbGrdw6fYyf4nnC795yhnwDh1QZGxPsFaysJSA_3-cjmw-29m-Ga0hD1ALfVE7R57iNLxkB6dyEuz1UFJhJyibRDW9sNspo2gQFZZGxMKQ","expires_in":3600,"token_type":"Bearer"}
那么我使用access_token来调用我的web api
这里是小提琴手(在作曲家窗格中)
GET http://localhost:4357/api/Test User-Agent: fiddler Host: localhost:4357 Content-Length: 0 Content-Type: application/x-www-form-urlencoded Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSIsImtpZCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSJ9.eyJjbGllbnRfaWQiOiJJZGVudGl0eVdlYlVJIiwic2NvcGUiOiJvcGVuaWQiLCJzdWIiOiJJIGFtIHRoZSBTdWJqZWN0IiwiYW1yIjoicGFzc3dvcmQiLCJhdXRoX3RpbWUiOjE0MjgzOTQ3MzAsImlkcCI6Imlkc3J2IiwiaXNzIjoiaHR0cHM6Ly9pZHNydjMuY29tIiwiYXVkIjoiaHR0cHM6Ly9pZHNydjMuY29tL3Jlc291cmNlcyIsImV4cCI6MTQyODM5ODMzMCwibmJmIjoxNDI4Mzk0NzMwfQ.cbB4YrRXaaRDNw8BjeI4Q1DvXN28xmJScMJBGWCM_zSLcH1i63cQVTmR8X86rGP5VrR0Ly4-EmWZ8911Vh4jc4Ua0Kgz2n7RbmQ6VqQX5Z_lM3F8EIgD81kpUn0v3hhSFW06aJ2Lo1XOZG_re84xGgqre-H4dC0XZR6IQMEAQ9Q5dOXBh8V1NxyLSh0PzyrRRmOnEndoaY4uaiftbp9j7knxxQ3ZdGmaYAO96xuhHfO1DbGrdw6fYyf4nnC795yhnwDh1QZGxPsFaysJSA_3-cjmw-29m-Ga0hD1ALfVE7R57iNLxkB6dyEuz1UFJhJyibRDW9sNspo2gQFZZGxMKQ
然后我得到响应仍然在fidler:
您可以按照下面的link获得更多信息,但与vnext无关.我将在此创建一个帖子,因为我需要一个angularJS应用程序来验证和使用隐式流而不是资源所有者流…与visual studio 2015预览
ASP.NET Core Web API操作的永久承载令牌身份验证
如何解决ASP.NET Core Web API操作的永久承载令牌身份验证?
我有一个有效的ASP.NET Core 3.1 Web API,我想限制对某些控制器中特定操作的访问。
此API没有有效的人工或网络浏览器使用者,因此没有cookie,也不需要标准的质询/响应身份验证模型。我只想确保允许任何调用某些操作的人这样做。
由于控制器的动作是如此原子,我希望我可以实现简单的东西,或者至少比复杂的,基于角色的外部身份服务更简单。这就是导致我阅读有关承载令牌的原因,在那里我阅读了非常有用的指南,例如this stack overflow answer和this JWT overview。
但是,这些模型似乎将令牌视为对永久的常规用户名/密码凭据的临时替换凭据。
用永久性承载令牌代替它建模会很困难吗?这将大大简化大多数授权流程和管理,因为消费类应用程序仅在Web API吊销了它们之后才需要请求新令牌。而且由于身份验证是在操作级别进行的,因此对于永久令牌而言,一个简单的“是/否”访问答案似乎非常适合,该令牌不需要长期的索赔或角色管理。
我不知道我是在错误地还是天真地思考,但这是我的问题。使用永久性承载令牌是否合理?如果是,如何在ASP.NET Core 3.1中实现它?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
ASP.Net MVC6是否支持OAuth 2承载令牌?
解决方法
这意味着…
> …您将能够使用外部身份提供商(如Azure Active Directory)使用Microsoft.AspNetCore.Authentication.JwtBearer包发出的承载令牌对您的用户进行身份验证:
app.UseJwtBearerAuthentication(new JwtBearerOptions { AutomaticAuthentication = true,Audience = "http://localhost:50000/",// Authority is only useful if your JWT tokens // are issued by an OpenID Connect server. Authority = "[OpenID Connect provider address]",// If you don't use an OpenID Connect server,you have to manually update the // token validation parameters with the issuer's signing key. TokenValidationParameters = new TokenValidationParameters { IssuerSigningKey = new X509SecurityKey(certificate) } });
也就是说,现在只支持JWT令牌OTB:与Katana 3一起提供的OAuth2承载中间件本身支持OAuth2授权服务器生成的不透明令牌,但此支持已被删除.
> …你将无法生产自己的代币. OAuth2授权服务器已被删除,不会移植到ASP.NET Core:OAuth Authorization Service in ASP.NET Core.
幸运的是,存在替代方案.我个人正在开发一个基于Katana附带的OAuth2服务器的OpenID Connect服务器中间件,它提供相同的低级别体验:https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server
有关更多信息,您可以查看此SO答案:Configure the authorization server endpoint
今天关于.NET Web API 2 OWIN承载令牌认证和认证令牌操作错误的介绍到此结束,谢谢您的阅读,有关angularjs – Web Api 2为承载令牌预检CORS请求、ASP.NET 5 OAuth承载令牌认证、ASP.NET Core Web API操作的永久承载令牌身份验证、ASP.Net MVC6是否支持OAuth 2承载令牌?等更多相关知识的信息可以在本站进行查询。
本文标签: