GVKun编程网logo

c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果

17

在这篇文章中,我们将为您详细介绍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结果

c# – 在ASP.NET WebApi 2中自定义承载令牌JSON结果

我演练了 this official ASP.NET tutorial,持有者令牌发布如下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 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请求

angularjs – Web Api 2为承载令牌预检CORS请求

我有一个具有AngularJS前端和Web Api 2后端的Web应用程序,它使用承载令牌进行身份验证。

一切都在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 LOC app.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",
new[] { "*" });
from the GrantResourceOwnerCredentials() method of
ApplicationOAuthProvide.cs.

Preflight CORS-request them gets
handled properly,and then the actual requet goes through

谢谢你,救了我整整一天。
因为它发生在许多人身上,我把你的评论给其他人可以看到的答案框。

我不想为此投票。请评论我的答案

谢谢

ASP.NET 5 OAuth承载令牌认证

ASP.NET 5 OAuth承载令牌认证

我试图在ASP.NET 5中实现OAuth承载令牌身份验证,并且正在努力寻找一个如何做到这一点的例子,因为OWIN的东西在ASP.NET 5中发生了变化.

例如IApplicationBuilder.USEOAuthAuthorizationServer()和IApplicationBuilder. USEOAuthBearerAuthentication()不再存在或者我没有参考?

任何指针都将不胜感激.

解决方法

我做了它的工作,但设置Thinktecture的身份服务器v 3作为我的令牌提供者,但我认为如果你有另一个令牌提供者将是相同的流程….

(更新:我添加了一个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 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操作的永久承载令牌身份验证的相关信息,请在本站寻找。

本文标签: