我们如何使用用户名和密码流在ASP.NET 5中使用持票令牌?对于我们的场景,我们希望让用户使用AJAX调用进行注册和登录,而无需使用外部登录.
为此,我们需要一个授权服务器端点.在以前的ASP.NET版本中,我们将执行以下操作,然后在ourdomain.com/TokenURL上登录.
// Configure the application for OAuth based flow
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14)
};
Run Code Online (Sandbox Code Playgroud)
但是,在当前版本的ASP.NET中,上述操作无效.我们一直试图找出新的方法.例如,GitHub上的aspnet/identity示例配置了Facebook,Google和Twitter身份验证,但似乎没有配置非外部OAuth授权服务器端点,除非这样AddDefaultTokenProviders()做,在这种情况下我们想知道到底是什么URL提供者会.
我们从阅读源代码中了解到,我们可以通过调用IAppBuilder.UseOAuthBearerAuthentication我们的Startup类来向HTTP管道添加"承载认证中间件" .虽然我们仍然不确定如何设置其令牌端点,但这是一个良好的开端.这不起作用:
public void Configure(IApplicationBuilder app)
{
app.UseOAuthBearerAuthentication(options =>
{
options.MetadataAddress = "meta";
});
// if this isn't here, we just get a 404
app.Run(async context =>
{
await context.Response.WriteAsync("Hello …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Web API,允许API的客户端(本机移动应用程序)使用第三方云存储提供程序登录.我正在使用Microsoft的以下一般流程:

这是我想要实现的目标:

我使用带有外部身份验证的默认ASP.NET Web API Visual Studio模板,以及用于Dropbox登录功能的OWin.Security.Providers Nuget包,以及用于Google(Drive)和Microsoft(OneDrive)的现有内置登录功能.
我遇到的问题是,内置功能似乎都是作为一个流程的一部分进行身份验证和授权.例如,如果我在Startup.Auth.cs中设置以下内容:
DropboxAuthenticationOptions dropboxAuthOptions = new DropboxAuthenticationOptions
{
AppKey = _dropboxAppKey,
AppSecret = _dropboxAppSecret
};
app.UseDropboxAuthentication(dropboxAuthOptions);
Run Code Online (Sandbox Code Playgroud)
...并从我的网络浏览器导航到此网址:
http://<api_base_url>/api/Account/ExternalLogin?provider=Dropbox&response_type=token&client_id=self&redirect_uri=<api_base_url>
Run Code Online (Sandbox Code Playgroud)
我已成功重定向到Dropbox登录:
https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=<id>&redirect_uri=<redirect_uri>
Run Code Online (Sandbox Code Playgroud)
...然后在我授予访问权限后,重定向回到:
http://<api_base_url>/Help#access_token=<access_token>&token_type=bearer&expires_in=1209600
Run Code Online (Sandbox Code Playgroud)
...因为你可以看到令牌是其中的一部分,所以可以提取.问题是客户端需要导航到Dropbox并将授权代码返回到Web API,Web API会将授权代码发送回第三方以获取令牌,然后将其返回给客户......如上图所示.我需要AccountController中的ExternalLogin操作以某种方式检索Dropbox url并将其返回给客户端(它只是一个json响应),但我没有看到一种方法来检索它(它只返回一个ChallengeResult,并且实际的Dropbox网址埋在某处).此外,我认为我需要一种方法来根据授权代码单独请求来自第三方的令牌.
这篇文章似乎与我想要做的有点类似:
使用OWIN标识从多个API客户端注册Web API 2外部登录
...但是那里的解决方案似乎要求客户端成为MVC应用程序,对我来说不一定是这样.我希望在客户端保持尽可能简单,遵循上图中的流程,但也不要重新发明轮子(尽可能多地重用OWIN/OAuth2实现中已存在的内容).理想情况下,我不希望客户端必须引用任何OWIN/OAuth库,因为我真正需要客户端做的就是访问API提供的外部URL(在我的示例中为Dropbox),让用户输入他们的凭据并授予权限,并将生成的授权代码发送回api.
从概念上讲,这听起来并不难,但我不知道如何实现它,仍然尽可能多地使用现有的OAuth代码.请帮忙!
我正在使用asp.net 5 rc2构建一个api.我正在尝试实现openiddict-core,在这里找到本地帐户,我也想让用户使用外部登录,例如谷歌.
我已经设置了所有,但当我尝试实施谷歌身份验证,我称之为代码
var info = await _signInManager.GetExternalLoginInfoAsync();
我在标题中收到错误消息.
在客户端,我使用Satellizer发现在这里,这需要打开谷歌提示窗口的关怀和发送回调到我的AuthController谷歌的方法,这是你看到正常的ChallengeResult代码在其他mvc6例子.
我已经编写了代码来手动获取用户详细信息,但是我认为我会使用已经构建的signInManager,而不是重现轮...
我可能没有正确设置,因为所有示例似乎都使用cookie,我猜测是因为它们是mvc6 Web应用程序,而不是api.我不想使用cookies,但这可能是我的问题.
现在为一些代码.
startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add MVC services to the services container.
services.AddMvc();
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(_configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders()
.AddOpenIddict(); // Add the OpenIddict services after registering the Identity services.
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// use jwt bearer authentication
app.UseJwtBearerAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.RequireHttpsMetadata = …Run Code Online (Sandbox Code Playgroud)