我有一個angularJS應用程序,它使用使用JwtBearerAuthentication進行身份驗證的asp.net vnext。要驗證應用程序,我使用AspNet.Security.OpenIdConnect.Server。當我登錄時,我收到一個包含access_token的json響應,我可以使用它來獲得授權請求。我想,也收到刷新令牌。這怎麼可能?在asp.net上使用不記名令牌身份驗證刷新令牌vnext
Startup.cs
public void Configure(IApplicationBuilder app) {
app.UseJwtBearerAuthentication(options => {
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.TokenValidationParameters.ValidateAudience = false;
options.Authority = Configuration.Get<string>("OAuth:Authority");
options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
metadataAddress: options.Authority + ".well-known/openid-configuration",
configRetriever: new OpenIdConnectConfigurationRetriever(),
docRetriever: new HttpDocumentRetriever() { RequireHttps = false });
});
app.UseOpenIdConnectServer(configuration => {
configuration.Issuer = new Uri(Configuration.Get<string>("OpenId:Issuer"));
configuration.AllowInsecureHttp = true;
configuration.AuthorizationEndpointPath = PathString.Empty;
configuration.AuthenticationScheme = OpenIdConnectServerDefaults.AuthenticationScheme;
configuration.Provider = new AuthorizationProvider();
});
}
AuthorizationProvider.cs
public class AuthorizationProvider : OpenIdConnectServerProvider {
public override Task ValidateClientAuthentication(ValidateClientAuthenticationContext context) {
context.Skipped();
return Task.FromResult<object>(null);
}
public override Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context) {
string username = context.UserName;
string password = context.Password;
UserManager<ApplicationUser> userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<ApplicationUser>>();
ApplicationUser user = userManager.FindByNameAsync(username).Result;
if (userManager.CheckPasswordAsync(user, password).Result) {
ClaimsIdentity identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme);
identity.AddClaim(ClaimTypes.Name, username, "token id_token");
List<string> roles = userManager.GetRolesAsync(user).Result.ToList();
foreach (string role in roles) {
identity.AddClaim(ClaimTypes.Role, role, "token id_token");
}
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
context.Validated(principal);
} else {
context.Rejected("invalid credentials");
}
return Task.FromResult<object>(null);
}
}
AngularJS登錄碼
$http({
method: 'POST',
url: 'connect/token',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
data: $.param({
grant_type: 'password',
username: email,
password: password
})
}).then(function (response) {
if (response.status == 200) {
var token = response.data.access_token;
localStorage.setItem('token', token);
}
});
在一個側面說明,你不應該禁止觀衆驗證('options.TokenValidationParameters.ValidateAudience = FALSE')。相反,請考慮使用'ticket.SetResources(new [] {「resource_server_1」})'在訪問令牌中設置正確的受衆並將其配置到您的JWT承載中間件選項中:'options.Audience =「resource_server_1」'。 – Pinpoint
你讓我不再問另一個問題。我會嘗試。謝謝 –