AspNet.Security.OpenIdConnect.Serverの例では、認証サーバーとリソースサーバーの両方に似ています。私はそれらを分離したいと思います。私はそうした。認証サーバのStartup.Configで認証サーバーとリソースサーバーをAspNet.Security.OpenIdConnectで区切る - 対象ユーザーですか?
、私は次の設定があります。
app.UseOpenIdConnectServer(options => {
options.AllowInsecureHttp = true;
options.ApplicationCanDisplayErrors = true;
options.AuthenticationScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.Issuer = new System.Uri("http://localhost:61854"); // This auth server
options.Provider = new AuthorizationProvider();
options.TokenEndpointPath = new PathString("/token");
options.UseCertificate(new X509Certificate2(env.ApplicationBasePath + "\\mycertificate.pfx","mycertificate"));
});
私が書かれAuthorizationProviderを持っていますが、私はそれが私の現在の問題に関連してだと思う(しかし、おそらく関連)はありません。それはすべてのトークンの要求のために検証しているように、そのGrantResourceOwnerCredentialsオーバーライド、Iハードコードでクレームプリンシパル:リソースサーバで
public override Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsNotification context)
{
var identity = new ClaimsIdentity(OpenIdConnectDefaults.AuthenticationScheme);
identity.AddClaim(ClaimTypes.Name, "me");
identity.AddClaim(ClaimTypes.Email, "[email protected]");
var claimsPrincipal = new ClaimsPrincipal(identity);
context.Validated(claimsPrincipal);
return Task.FromResult<object>(null);
}
、私はそのStartup.configに次き:
app.UseWhen(context => context.Request.Path.StartsWithSegments(new PathString("/api")), branch =>
{
branch.UseOAuthBearerAuthentication(options => {
options.Audience = "http://localhost:54408"; // This resource server, I believe.
options.Authority = "http://localhost:61854"; // The auth server
options.AutomaticAuthentication = true;
});
});
フィドラーで、私はトークンを求める、と私は1つを得る:
POST /token HTTP/1.1
Host: localhost:61854
Content-Type: application/x-www-form-urlencoded
username=admin&password=aaa000&grant_type=password
をだから今、私は、リソースサーバから保護されたリソースにアクセスするために、そのアクセストークンを使用します。
GET /api/values HTTP/1.1
Host: localhost:54408
Content-Type: application/json;charset=utf-8
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI.....
このエラーが発生する - オーディエンスの検証に失敗しました。視聴者:「空」。 validationParameters.ValidAudience: 'http://localhost:54408'またはvalidationParameters.ValidAudiences: 'null'と一致しませんでした。
は私が(app.UseOpenIdConnectServer(...)で)認証サーバで聴衆を設定することはありませんので、理由が理由だと思うので、私はそれがトークンへの視聴者の情報を書いたとは思いません。ですから、私は認証サーバーで(IdentityServer3で行われているように)オーディエンスを設定する必要がありますが、私はそれを可能にするオプションオブジェクトのプロパティを見つけることができません。
AspNet.Security.OpenIdConnect.Serverはauthとリソースが同じサーバーに存在する必要がありますか?
ClaimsPrincipalをまとめるときに視聴者を設定していますか?
カスタムオーディエンスバリデータを作成してシステムに接続する必要がありますか? (これに対する答えがいいえであることを願っています)
ありがとうございました!それは今働きます!複数のユーザーがアクセストークンをリクエストできるようにするため、オプション1を使用しました。 –
@MickaelCaruso 'ticket.SetResources'を使用するための私の答えを更新しました。' resource'パラメータは次回のベータ版でネイティブにサポートされなくなりました(https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnectを参照)。詳細については、Server/Issues/186を参照してください)。また、アクセストークンのデフォルトフォーマットとしてJWTの使用を中止します。https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/issues/186 – Pinpoint
ありがとうございました。本当に助けてくれました。私のGrantResourceOwnerCredentialsメソッドはほぼ同じですが、私も identity.AddClaim(ClaimTypes.Name、 "MyFullName");を追加しました。 しかし、Web APIコントローラでUser.GetUserName()を呼び出すと、NULLが返されますか? User.GetUserId()は、NameIdentifierクレームで渡されるものを返します。 User.GetUserNameにデータを返すにはどうすればよいですか? – partyelite