在这篇文章中,我们将为您详细介绍c#–在ASP.NETWebApi2中自定义承载令牌JSON结果的内容。此外,我们还会涉及一些关于.NETWebAPI2OWIN承载令牌认证、angularjs–Web
在这篇文章中,我们将为您详细介绍c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果的内容。此外,我们还会涉及一些关于.NET Web API 2 OWIN承载令牌认证、angularjs – Web Api 2为承载令牌预检CORS请求、ASP.NET 5 OAuth承载令牌认证、ASP.NET Core Web API操作的永久承载令牌身份验证的知识,以帮助您更全面地了解这个主题。
本文目录一览:- c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果
- .NET Web API 2 OWIN承载令牌认证
- angularjs – Web Api 2为承载令牌预检CORS请求
- ASP.NET 5 OAuth承载令牌认证
- ASP.NET Core Web API操作的永久承载令牌身份验证
c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果
{ "access_token":"boQtj0SCGz2GFGz[...]","token_type":"bearer","expires_in":1209599,"userName":"Alice",".issued":"Mon,14 Oct 2013 06:53:32 GMT",".expires":"Mon,28 Oct 2013 06:53:32 GMT" }
我想添加用户配置文件属性以及上面的结果,以减少来自客户端的请求数.示例如下……
{ "access_token":"boQtj0SCGz2GFGz[...]",28 Oct 2013 06:53:32 GMT","Notifications":35,"IsEventMember":true,"Promotion":324372 }
我使用的oauth提供程序来自默认的ASP.NET模板(ApplicationOAuthProvider.cs),OAuthOption如下所示.
OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"),Provider = new ApplicationOAuthProvider(PublicclientId,UserManagerFactory),AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),AccesstokenExpireTimeSpan = TimeSpan.FromDays(14),AllowInsecureHttp = true };
我该怎么做?
请注意,我的问题与adding extra claims不同.
解决方法
public override async Task TokenEndpoint(OAuthTokenEndpointContext context) { context.AdditionalResponseParameters.Add("username","user@mail.com"); return Task.Fromresult<object>(null); }
.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)
};
}
但是无论我做什么,这项服务都是“未经授权”的。我在这里想念什么吗?
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 (将#修改为@)
关于c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.NET Web API 2 OWIN承载令牌认证、angularjs – Web Api 2为承载令牌预检CORS请求、ASP.NET 5 OAuth承载令牌认证、ASP.NET Core Web API操作的永久承载令牌身份验证的相关信息,请在本站寻找。
本文标签: