- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设置我自己的 OAuth2 服务器。到目前为止,我已成功实现 GrantResourceOwnerCredentials
在我的 OAuthAuthorizationServerProvider
实现中.现在,因为我正在为我们的业务开发应用程序,所以我想实现 OAuth2 授权代码授权。
我试图按照这里的指示https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server但在我的实现中,我还没有找到如何到达 Create
AuthorizationCodeProvider
的呼唤(我在 OAuthAuthorizationServerOptions
中设置)。
我已经简要检查了是否访问TokenEndpointPath
使用(错误的)代码参数有效,并且在调试器中我看到我的 AuthorizationCodeProvider
的 Receive
调用被击中。当然没有成功,因为我发送的代码是“sometestcode”而不是真正的代码,但是代码被命中了,所以这意味着我走在正确的道路上。
这是我到目前为止所拥有的:
public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
if (OAuthRepository.GetClient(context.ClientId) != null)
{
var expectedRootUri = new Uri(context.Request.Uri, "/");
if (context.RedirectUri.StartsWith(expectedRootUri.AbsoluteUri))
{
context.Validated();
return Task.FromResult<object>(null);
}
}
context.Rejected();
return Task.FromResult<object>(null);
}
public override Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
{
// I know this is wrong but it's just a start and not the focus of this SO question.
context.Response.Redirect(context.AuthorizeRequest.RedirectUri);
context.RequestCompleted();
return Task.FromResult<object>(null);
}
public override Task GrantAuthorizationCode(OAuthGrantAuthorizationCodeContext context)
{
// Needs additional checks, not the focus of my question either
var newTicket = new AuthenticationTicket(context.Ticket.Identity, context.Ticket.Properties);
context.Validated(newTicket);
return Task.FromResult<object>(null);
}
AuthorizeEndpointPath
与
redirect_uri
,我立即被送到那个乌里。我知道这是错误的:我应该被发送到一个单独的登录页面。稍后我将修复我的 Web API 以重定向到正确的 Uri。
[HttpGet]
[ImportModelStateFromTempData]
public ActionResult Authorize(string clientId, string returnUrl, string responseType)
{
AuthorizeViewModel viewModel = new AuthorizeViewModel();
...
...
...
return View(viewModel);
}
[HttpPost]
[ExportModelStateToTempData]
public async Task<ActionResult> Authorize(AuthorizeViewModel viewModel)
{
// NOTE: This is in MVC and is postback from *.cshtml View.
OAuth2Client.?????? // <=== How to obtain authorization code from WebAPI?
...
return Redirect(returnUrl);
}
Create
流的一部分。我希望有人能帮助我理解我没有看到的东西。我有一个盲点,我认为...
public override Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
{
System.Security.Claims.ClaimsIdentity ci = new System.Security.Claims.ClaimsIdentity("Bearer");
context.OwinContext.Authentication.SignIn(ci);
context.RequestCompleted();
return Task.FromResult<object>(null);
}
AuthorizationCodeProvider.Create
像这样:
public void Create(AuthenticationTokenCreateContext context)
{
context.Ticket.Properties.IssuedUtc = DateTime.UtcNow;
context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(60);
// Some random Guid
context.SetToken(Guid.NewGuid().ToString("n"));
}
/authorize
重定向到
redirect_uri
带有查询参数 code=<THE_RANDOM_GUID>
! :D
ValidateClientAuthentication
显然不是 AuthorizeEndpoint
的一部分.如何在 AuthorizeEndpoint 中获取 ClientId? AuthorizationCodeProvider.Create
中获取 ClientId以便我可以将其与代码一起存储? ClaimsIdentity
对于登录用户? 最佳答案
所以,在网上搜索了一些之后,我通过搜索github获得了一些成功。显然,OAuthAuthorizationServerProvider
提供 AuthorizeEndpoint
并且该方法应该用于“嘿,你没有被授权,去登录你!”以及“啊,好吧,你很酷,这是一个授权码。”。我原以为OAuthAuthorizationServerProvider
将有两个单独的方法,但它没有。这就解释了为什么在 github 上,我找到了一些实现 AuthorizeEndpoint
的项目。以一种相当奇特的方式。我采用了这个。下面是一个例子:
public override async Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
{
if (context.Request.User != null && context.Request.User.Identity.IsAuthenticated)
{
var redirectUri = context.Request.Query["redirect_uri"];
var clientId = context.Request.Query["client_id"];
var authorizeCodeContext = new AuthenticationTokenCreateContext(
context.OwinContext,
context.Options.AuthorizationCodeFormat,
new AuthenticationTicket(
(ClaimsIdentity)context.Request.User.Identity,
new AuthenticationProperties(new Dictionary<string, string>
{
{"client_id", clientId},
{"redirect_uri", redirectUri}
})
{
IssuedUtc = DateTimeOffset.UtcNow,
ExpiresUtc = DateTimeOffset.UtcNow.Add(context.Options.AuthorizationCodeExpireTimeSpan)
}));
await context.Options.AuthorizationCodeProvider.CreateAsync(authorizeCodeContext);
context.Response.Redirect(redirectUri + "?code=" + Uri.EscapeDataString(authorizeCodeContext.Token));
}
else
{
context.Response.Redirect("/account/login?returnUrl=" + Uri.EscapeDataString(context.Request.Uri.ToString()));
}
context.RequestCompleted();
}
OAuthAuthorizationServerProvider
照顾这个。只要您在票证中设置“client_id”,它就会检查为授权码请求访问 token 的客户端是否相同。
AuthorizeEndpoint
。再次。如果您使用访问 token ,您的登录页面必须使用访问 token 向“AuthorizeEndpoint”发出请求以获取授权代码。 (不要将访问 token 提供给第三方。您的登录页面请求授权代码并将其发回。)换句话说,如果您使用访问 token ,则此流程中涉及两个客户端。
关于oauth-2.0 - AuthorizationCodeProvider : Create is never called, 如何生成授权码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55722767/
我正在使用 msgraph-sdk-java-auth通过我创建的应用程序。 我正在尝试使用对象 AuthorizationCodeProvider 从 Microsoft Azure 获取数据但我无
我正在设置我自己的 OAuth2 服务器。到目前为止,我已成功实现 GrantResourceOwnerCredentials在我的 OAuthAuthorizationServerProvider
我是一名优秀的程序员,十分优秀!