DotNetOpenAuth 不适用于 MVC 5 RC

作者:编程家 分类: 编程代码 时间:2025-10-15

使用DotNetOpenAuth的开发人员可能会遇到一个问题,即它不适用于MVC 5 RC。在本篇文章中,我们将探讨这个问题,并提供解决方案。

问题

DotNetOpenAuth是一个用于.NET开发的开源库,可以帮助开发人员实现OAuth和OpenID身份验证。然而,对于使用MVC 5 RC的开发人员来说,他们可能会发现DotNetOpenAuth不再适用。

原因

MVC 5 RC引入了一些重大的更改,其中包括将原生的OAuth和OpenID身份验证支持集成到框架中。这意味着开发人员不再需要使用DotNetOpenAuth库来实现这些功能,而是可以直接使用框架提供的功能。

解决方案

对于使用MVC 5 RC的开发人员来说,他们可以通过以下步骤来实现OAuth和OpenID身份验证:

1. 在MVC项目中启用身份验证功能。可以通过在Web.config文件中的节点下添加以下代码来实现:

xml

2. 在IdentityConfig.cs文件中配置身份验证。可以通过在App_Start文件夹中创建一个名为IdentityConfig.cs的文件,并添加以下代码来实现:

csharp

public class IdentityConfig

{

public void Configuration(IAppBuilder app)

{

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions

{

ClientId = "YOUR_CLIENT_ID",

Authority = "YOUR_AUTHORITY",

RedirectUri = "YOUR_REDIRECT_URI",

SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie

});

}

}

请确保替换YOUR_CLIENT_ID、YOUR_AUTHORITY和YOUR_REDIRECT_URI为实际的值。这些值可以从OAuth和OpenID提供商的开发者帐户中获取。

3. 在AccountController.cs文件中添加OAuth和OpenID身份验证的相关操作。可以通过在Controllers文件夹中创建一个名为AccountController.cs的文件,并添加以下代码来实现:

csharp

[AllowAnonymous]

public async Task ExternalLoginCallback(string returnUrl)

{

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

if (loginInfo == null)

{

return RedirectToAction("Login");

}

var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);

switch (result)

{

case SignInStatus.Success:

return RedirectToLocal(returnUrl);

case SignInStatus.LockedOut:

return View("Lockout");

case SignInStatus.RequiresVerification:

return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });

case SignInStatus.Failure:

default:

var user = new ApplicationUser { UserName = loginInfo.Email, Email = loginInfo.Email };

var registrationResult = await UserManager.CreateAsync(user);

if (registrationResult.Succeeded)

{

registrationResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);

if (registrationResult.Succeeded)

{

await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

return RedirectToLocal(returnUrl);

}

}

AddErrors(registrationResult);

return View("ExternalLoginFailure");

}

}

这段代码将处理OAuth和OpenID身份验证的回调,并根据验证结果执行相应的操作。

案例代码

以下是一个简单的示例,演示了如何在MVC 5 RC中实现OAuth和OpenID身份验证:

csharp

public class AccountController : Controller

{

private ApplicationUserManager _userManager;

private ApplicationSignInManager _signInManager;

public AccountController()

{

}

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)

{

UserManager = userManager;

SignInManager = signInManager;

}

public ApplicationUserManager UserManager

{

get

{

return _userManager ?? HttpContext.GetOwinContext().GetUserManager();

}

private set

{

_userManager = value;

}

}

public ApplicationSignInManager SignInManager

{

get

{

return _signInManager ?? HttpContext.GetOwinContext().Get();

}

private set

{

_signInManager = value;

}

}

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

public ActionResult ExternalLogin(string provider, string returnUrl)

{

return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));

}

[AllowAnonymous]

public async Task ExternalLoginCallback(string returnUrl)

{

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

if (loginInfo == null)

{

return RedirectToAction("Login");

}

var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);

switch (result)

{

case SignInStatus.Success:

return RedirectToLocal(returnUrl);

case SignInStatus.LockedOut:

return View("Lockout");

case SignInStatus.RequiresVerification:

return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });

case SignInStatus.Failure:

default:

var user = new ApplicationUser { UserName = loginInfo.Email, Email = loginInfo.Email };

var registrationResult = await UserManager.CreateAsync(user);

if (registrationResult.Succeeded)

{

registrationResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);

if (registrationResult.Succeeded)

{

await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

return RedirectToLocal(returnUrl);

}

}

AddErrors(registrationResult);

return View("ExternalLoginFailure");

}

}

private IAuthenticationManager AuthenticationManager

{

get

{

return HttpContext.GetOwinContext().Authentication;

}

}

private void AddErrors(IdentityResult result)

{

foreach (var error in result.Errors)

{

ModelState.AddModelError("", error);

}

}

private ActionResult RedirectToLocal(string returnUrl)

{

if (Url.IsLocalUrl(returnUrl))

{

return Redirect(returnUrl);

}

else

{

return RedirectToAction("Index", "Home");

}

}

}

以上例子中,我们创建了一个AccountController类,其中包含了处理OAuth和OpenID身份验证的相关操作。

对于使用MVC 5 RC的开发人员来说,DotNetOpenAuth可能不再是一个合适的选择。然而,通过使用MVC框架提供的原生功能,我们可以轻松地实现OAuth和OpenID身份验证。希望本文对您有所帮助!