我已经创建了一个自定义身份验证服务器,它实现了OAuthAuthorizationServerProvider以及使用此服务器进行身份验证所需的所有其他类。该服务器由ASP.NET Web API项目组成。这是一个独立的项目,我想使用OAuth 2.0来使用它来验证某些应用程序。想想多个ASP.NET MVC 5网站。 AuthenticationServer和网站彼此分开托管。
这就是我想创建一个自定义AuthenticationProvider的原因,我可以在我的ASP.NET MVC 5网站中使用它来验证用户身份。 这Overview是我想要实现的全球情况。
我希望每个客户/网站都有一个登录屏幕,他们可以填写用户凭据,然后我希望网站与配置的ClientId& ClientSecret和给定的用户凭据。然后,如果用户通过身份验证,则用户应该能够在cookie或会话中保存其访问令牌和所有其他用户信息(如姓名等)。
我尝试为它开发一个AuthenticationProvider,因此很容易将身份验证移植到多个ASP.NET网站,但我还没有成功。我也不知道我的方法是否使用AuthenticationProvider是正确的做法,因此非常欢迎有关此方法和替代方法的建议。
我已经尝试过开发这样的AuthenticationProvider并尝试在Startup-class中配置它:
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType("ExternalCookie");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ExternalCookie",
AuthenticationMode = AuthenticationMode.Passive,
CookieName = ".AspNet.ExternalCookie",
ExpireTimeSpan = TimeSpan.FromMinutes(5),
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
var options = new CustomAuthenticationOptions
{
ClientId = "42ff5dad3c274c97a3a7c3d44b67bb42",
ClientSecret = "jh52g35vnm23bjh54g235jhg234",
Provider = new CustomAuthenticationProvider
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new Claim("urn:token:customprovider", context.AccessToken));
return Task.FromResult(true);
}
}
};
app.UseCustomAuthentication(options);
}
}
但是,提供程序能够与AuthenticationServer通信,但无法对客户端进行身份验证。我不知道这是怎么造成的。似乎AuthenticationProvider没有发送ClientId&在请求中秘密(正确)。
我创建了一个小原型来测试我的AuthenticationServer,它使用来自Thinktecture.IdentityModel.Client的OAuth2Client来验证用户:
string tokenEndpoint = "http://localhost:61182/oauth/token"; // Token end point
OAuth2Client client = new OAuth2Client(new Uri(tokenEndpoint), "42ff5dad3c274c97a3a7c3d44b67bb42", "jh52g35vnm23bjh54g235jhg234"); // Client ID and Secret
TokenResponse tokenResponse = client.RequestResourceOwnerPasswordAsync("testAcc", "test").Result;
AuthenticationServer能够处理此问题并在身份验证成功时返回Accesstoken。然后,Accesstoken用于对AuthenticationServer内的控制器进行经过身份验证的请求。 这很成功,但我想为ASP.NET MVC网站实现这一点。
我的问题是:使用我的AuthenticationServer for ASP.NET MVC网站实现自定义身份验证的最佳方法是什么?