我有一个网络Api,其路径指向Startup.Auth中的登录令牌设置,如下所示:
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = false
};
那应该将我的api登录请求路由到这里:
[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
[AllowAnonymous]
[Route("ExternalLogin", Name = "ExternalLogin")]
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
{
Authorize stuff...
}
从我的客户端我正在尝试登录并获取访问令牌:
var loginResponse = await client.PostAsync("/Token", loginContent);
使用登录内容:
var values = new Dictionary<string, string>();
values.Add("grant_type", "password");
values.Add("username", "usernamehere");
values.Add("password", "passwordhere");
var loginContent = new FormUrlEncodedContent(values);
当我尝试进入/ Token的PostAsync以获取access_token时,我总是遇到内部服务器错误。我甚至无法进入api看看发生了什么。
如果我从api方法中删除[Authorize]装饰,我可以恢复我的数据......我无法登录。
如果我转到浏览器并将以下内容放入网址进行测试...
https://localhost:44305/Token
我收到了(400)错误的请求。不知道下一步该尝试什么。
我必须让Token Auth工作......没有安全性就无法发布。 ;)
更新:
我应该补充说我正在使用自定义UserStore来识别身份。
更新2:客户端
public static HttpClient GetClient()
{
HttpClient Client = new HttpClient();
Client.BaseAddress = new Uri(Ics2Constants.ICS2APIBaseAddress);
Client.DefaultRequestHeaders.Accept.Clear();
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return Client;
}
然后使用:
using (var client = ICS2HttpClient.GetClient())
{
//TESTING:
await ICS2HttpClient.Authenticate(client);
//... more stuff after authentication
}
身份验证包含PostAsync ...
答案 0 :(得分:0)
授权属性不应放在任何获取令牌的匿名方法之上
答案 1 :(得分:0)
以防其他人犯同样的愚蠢错误:
GrantResourceOwnerCredentials是/ Token在验证用户/密码并丢弃访问令牌时路由到的位置。
在我的情况下,下面的代码位于ApplicationOAuthProvider.cs的Providers目录中
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
private readonly string _publicClientId;
public ApplicationOAuthProvider(string publicClientId)
{
if (publicClientId == null)
{
throw new ArgumentNullException("publicClientId");
}
_publicClientId = publicClientId;
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
// use the userManager to find the user, check credentials, grab roles, etc.
}
如果有人需要更多帮助,我可以发布更多细节。我知道弄清楚所有细节对我来说很痛苦。
还有一点需要注意。我根据mySQL标识内容here
编写了自定义标识内容