OWIN 라이브러리를 통해 Google 계정으로 사용자를 인증하는 ASP.NET MVC 애플리케이션이 있습니다.Gmail에 로그인하지 않고 OWIN으로 ASP.NET MVC 앱을 인증
사용자는 호스트 컴퓨터 (고객) 컴퓨터의 공용 웹 컴퓨터에 로그인하여 웹 응용 프로그램의 일부 데이터를 관리 할 수 있습니다.
Google 로그인 페이지로 리디렉션되는 로그인 버튼이 있습니다. 사용자가 사용자 이름과 비밀번호를 입력하고이 웹 앱으로 다시 리디렉션됩니다. 지금까지는 괜찮습니다. 이것이 OWIN이 일반적으로 작동하는 방식입니다.
사용자가 앱을 로그 아웃하는 것을 잊어 버리고 누군가가 웹 앱에서 데이터를 캡처 할 염려가 있습니다. 이것은 모든 웹 응용 프로그램의 위험을 감수합니다. 동의해야합니다. 그러나 사용자가 로그 아웃하는 것을 잊어 버리면 누군가가 Gmail, Google 문서 및 모든 관련 Google 서비스의 모든 이메일을 캡처한다는 추가적인 위험이 있습니다.
Owin이 사용자를 Google 로그인 페이지로 리디렉션 한 후 Google은 Gmail 및 웹 브라우저의 모든 관련 Google 서비스에 로그인 사용자가 아닌 웹 앱에 권한을 부여하는 방식으로 Owin 인증을 수정하고자합니다.
다음 코드는 웹 앱 인증의 부작용으로 Gmail에도 로그인합니다. OWIN의 구성 옵션이 많이 있다는 것을 알았습니다. 달성 할 수 있다고 생각합니다.
public partial class Startup
{
private double _expirationTimeCookies = 30; // minutes - sliding expiration
public static ApplicationUserManager ApplicationUserManagerCreate(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var userStore = new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>());
var tokenProvider = new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("ASP.NET Identity"));
ApplicationUserManager manager = new ApplicationUserManager(userStore);
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = tokenProvider;
}
return ApplicationUserManager.Create(tokenProvider, manager);
}
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManagerCreate);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
ExpireTimeSpan = TimeSpan.FromMinutes(_expirationTimeCookies),
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(_expirationTimeCookies),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager, Helpers.IdentityExtensions.OnlineSettingsForAccount(user.Id)))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
ClientId = "xxxxxxxxxx.apps.googleusercontent.com",
ClientSecret = "xxxxxxx",
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnApplyRedirect = delegate(GoogleOAuth2ApplyRedirectContext context)
{
string redirect = context.RedirectUri;
redirect += "&prompt=select_account";
context.Response.Redirect(redirect);
}
},
});
}
}
따라서 앱이 공용 컴퓨터에서 실행되며, 사용자가 로그 아웃하는 것을 잊어 버리면 다음 사용자가 이전 사용자의 Gmail 및 기타 Google 서비스를 열 수 없도록하고 싶습니다. – CodeCaster
그리고 Google에서 사용자를 Google 서비스에 로그인하지 않고 어떻게 확인할 것입니까? – Evk
@CodeCaster 예, 정확하게. – qub1n