我正在使用ASP.NET MVC和使用ServiceStack的API开发一个网站。
我想很快添加身份验证。该网站将至少有两种类型的用户和服务提供商'和服务消费者'虽然用户可以有多个角色。
我愿意使用新的MVC身份,但我希望我使用的任何东西都可以很好地用于servicestack API和MVC'页面'不一定使用API但应根据登录显示不同的内容。我不想要求 javascript进行登录/注销。
我希望解决方案使用令牌,因为我没有在其他任何地方使用会话状态,但我对其他选项持开放态度,只要他们可以在云提供商上水平扩展(用户下一个请求可能会转到不同的后台实例 - 端)。
任何人都有理想解决方案的例子吗?
(N.B:我对外部托管服务不感兴趣)。
答案 0 :(得分:2)
ServiceStack的身份验证也可以由外部ASP.NET Web框架使用,ServiceStack and MVC Integration docs显示了如何accept Login credentials from a MVC Controller and register them with ServiceStack:
public ActionResult Login(string userName, string password, string redirect=null)
{
if (ModelState.IsValid)
{
try
{
using (var authService = ResolveService<AuthenticateService>())
{
var response = authService.Authenticate(new Authenticate {
provider = CredentialsAuthProvider.Name,
UserName = userName,
Password = password,
RememberMe = true,
});
// add ASP.NET auth cookie
FormsAuthentication.SetAuthCookie(userName, true);
return Redirect(string.IsNullOrEmpty(redirect) ? "/" : redirect);
}
}
catch (Exception ex)
{
ModelState.AddModelError(string.Empty, ex.Message);
}
}
return View("Index", GetViewModel());
}
http://mvc.servicestack.net现场演示展示了使用标准MVC HTML表格调用此控制器的示例。
然后,您的MVC控制器可以继承ServiceStackController以访问Authenticated Users Session和不同的ServiceStack提供程序,以下是与会话和身份验证相关的API:
public class ServiceStackController : Controller
{
//...
ISession SessionBag { get; set; }
bool IsAuthenticated { get; set; }
IAuthSession GetSession(bool reload = true);
TUserSession SessionAs<TUserSession>();
void ClearSession();
}
如果您需要,还可以enable ServiceStack's different OAuth providers,可以选择直接回拨到ServiceStack服务或
答案 1 :(得分:1)
除了mythz回答之外,我还需要知道用户是否在视图中进行了身份验证,并且正常的Request.IsAuthenticated在您执行上述操作时不起作用。所以我创建了一个CustomWebViewPage(要使用它,你必须在View文件夹的Web.config中更改 * pageBaseType =“Your.NameSpace.CustomWebViewPage”)。
public abstract class CustomWebViewPage : WebViewPage
{
private IServiceStackProvider _serviceStackProvider;
public virtual IServiceStackProvider ServiceStackProvider
{
get
{
return _serviceStackProvider ?? (_serviceStackProvider =
new ServiceStackProvider(new AspNetRequest(base.Context, GetType().Name)));
}
}
public virtual bool IsAuthenticated
{
get { return ServiceStackProvider.IsAuthenticated; }
}
}
public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
//EXACTLY the same as above method...